{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e6e1dbf6-f634-45de-8df2-f28ccd9e987c",
   "metadata": {},
   "source": [
    "### 因子与三日涨幅超过15%相关性分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "e5d3a5d5-e448-48fa-a3cd-82606f2d3d84",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:50:40.673424Z",
     "iopub.status.busy": "2025-07-02T12:50:40.673424Z",
     "iopub.status.idle": "2025-07-02T12:50:40.691211Z",
     "shell.execute_reply": "2025-07-02T12:50:40.691211Z",
     "shell.execute_reply.started": "2025-07-02T12:50:40.673424Z"
    }
   },
   "outputs": [],
   "source": [
    "from datetime import date\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import time\n",
    "from scipy.stats import pearsonr\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from scipy.stats import spearmanr\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from matplotlib import rcParams\n",
    "\n",
    "# 设置中文字体（优先使用 SimHei 或 Microsoft YaHei）\n",
    "rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Kaiti', 'FangSong']\n",
    "# 解决负号显示为方块的问题\n",
    "rcParams['axes.unicode_minus'] = False\n",
    "\n",
    "# # 测试绘图\n",
    "# plt.plot([1, 2, 3], [4, 5, 6])\n",
    "# plt.title(\"中文标题示例\")\n",
    "# plt.xlabel(\"横轴标签\")\n",
    "# plt.ylabel(\"纵轴标签\")\n",
    "# plt.show()\n",
    "\n",
    "today_str = date.today().strftime(\"%m_%d\")\n",
    "execfile('yanmu_v3/v3_yinzi.py')\n",
    "execfile('yanmu_v3/yanmu_util.py')\n",
    "execfile('yanmu_v3/yanmu_label.py')\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "fe426203-3b7e-436a-83dd-4d9203e9fb2f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:20:24.221372Z",
     "iopub.status.busy": "2025-07-02T12:20:24.220375Z",
     "iopub.status.idle": "2025-07-02T12:20:24.223635Z",
     "shell.execute_reply": "2025-07-02T12:20:24.223635Z",
     "shell.execute_reply.started": "2025-07-02T12:20:24.221372Z"
    }
   },
   "outputs": [],
   "source": [
    " # 加载模型\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "02d14715-49da-4c9d-9f10-92a369da1dc6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9e5b4e5e-5e59-4952-a8a2-d56fdb6431e3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:20:53.228485Z",
     "iopub.status.busy": "2025-07-02T12:20:53.227484Z",
     "iopub.status.idle": "2025-07-02T12:21:52.671181Z",
     "shell.execute_reply": "2025-07-02T12:21:52.671181Z",
     "shell.execute_reply.started": "2025-07-02T12:20:53.228485Z"
    }
   },
   "outputs": [],
   "source": [
    "train_df = pd.read_csv('output/v3_train_feature.csv')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c23a7404-f411-422f-8eea-d4bb0b1752bb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:21:52.673180Z",
     "iopub.status.busy": "2025-07-02T12:21:52.673180Z",
     "iopub.status.idle": "2025-07-02T12:21:57.701600Z",
     "shell.execute_reply": "2025-07-02T12:21:57.701600Z",
     "shell.execute_reply.started": "2025-07-02T12:21:52.673180Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "40321 \n",
      "   Index(['date', 'code', 'open', 'close', 'high', 'low', 'quote_rate',\n",
      "       'turnover', 't_rate', 'xl',\n",
      "       ...\n",
      "       'ret3', 'd_turnover_max', 'max_pct', 'raise_score', 'turnover_score',\n",
      "       'score', 'd10_max', 'r_d10_score', 'final_score', 'label'],\n",
      "      dtype='object', length=152)\n"
     ]
    }
   ],
   "source": [
    "f_l_df = binarize_ret(train_df)\n",
    "f_l_df = f_l_df.dropna(subset=['r15','ret3'])\n",
    "\n",
    "f_l_df = f_l_df[f_l_df['raise_buy'] < 3]\n",
    "f_l_df = f_l_df[f_l_df['is_zt'] & (f_l_df['zt_num'] <2)]\n",
    "p_col_len(f_l_df)\n",
    "X_train = train_df.drop(columns=['label', 'date', 'code', 'ret3'], errors='ignore')\n",
    "y_train = train_df['label']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ac0d8033-d927-4a5e-ba6b-96ca9c654b2e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b3fea8af-3031-4fc9-a18d-4f7190672b24",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:22:23.895743Z",
     "iopub.status.busy": "2025-07-02T12:22:23.894740Z",
     "iopub.status.idle": "2025-07-02T12:22:23.900860Z",
     "shell.execute_reply": "2025-07-02T12:22:23.899870Z",
     "shell.execute_reply.started": "2025-07-02T12:22:23.895743Z"
    }
   },
   "outputs": [],
   "source": [
    "# list(train_df.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4ac974ff-6574-4ffa-be6c-932f6ffb1f0c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "22bca82e-44af-4412-81e6-30d176555238",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:22:32.464079Z",
     "iopub.status.busy": "2025-07-02T12:22:32.463079Z",
     "iopub.status.idle": "2025-07-02T12:22:32.762450Z",
     "shell.execute_reply": "2025-07-02T12:22:32.762450Z",
     "shell.execute_reply.started": "2025-07-02T12:22:32.464079Z"
    }
   },
   "outputs": [],
   "source": [
    "model_recall_path='input/model/v3/v3_10_high_recall_zt_1.txt'\n",
    "model_precision_path='input/model/v3/v3_10_high_precision_zt_1.txt'\n",
    "is_reacall = True\n",
    "if is_reacall:\n",
    "    model_path = model_recall_path\n",
    "else:\n",
    "    model_path = model_precision_path\n",
    "model = lgb.Booster(model_file=model_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "e2128b9d-1212-47eb-a67d-70ec9f307c0a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:39:53.092019Z",
     "iopub.status.busy": "2025-07-02T12:39:53.092019Z",
     "iopub.status.idle": "2025-07-02T12:43:56.136272Z",
     "shell.execute_reply": "2025-07-02T12:43:56.136272Z",
     "shell.execute_reply.started": "2025-07-02T12:39:53.092019Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "采样完成: 5000 个样本\n",
      "计算内置特征重要性...\n",
      "计算SHAP值...\n",
      "SHAP计算失败: Expected a 1D array, got an array with shape (148, 4)\n",
      "计算置换重要性...\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\x\\miniforge3\\Lib\\site-packages\\joblib\\externals\\loky\\process_executor.py:752: UserWarning: A worker stopped while some jobs were given to the executor. This can be caused by a too short worker timeout or by a memory leak.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
      "\u001b[31mKeyboardInterrupt\u001b[39m                         Traceback (most recent call last)",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\miniforge3\\Lib\\site-packages\\joblib\\parallel.py:1650\u001b[39m, in \u001b[36mParallel._get_outputs\u001b[39m\u001b[34m(self, iterator, pre_dispatch)\u001b[39m\n\u001b[32m   1649\u001b[39m     \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m._backend.retrieval_context():\n\u001b[32m-> \u001b[39m\u001b[32m1650\u001b[39m         \u001b[38;5;28;01myield from\u001b[39;00m \u001b[38;5;28mself\u001b[39m._retrieve()\n\u001b[32m   1652\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mGeneratorExit\u001b[39;00m:\n\u001b[32m   1653\u001b[39m     \u001b[38;5;66;03m# The generator has been garbage collected before being fully\u001b[39;00m\n\u001b[32m   1654\u001b[39m     \u001b[38;5;66;03m# consumed. This aborts the remaining tasks if possible and warn\u001b[39;00m\n\u001b[32m   1655\u001b[39m     \u001b[38;5;66;03m# the user if necessary.\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\miniforge3\\Lib\\site-packages\\joblib\\parallel.py:1762\u001b[39m, in \u001b[36mParallel._retrieve\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m   1759\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m ((\u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m._jobs) == \u001b[32m0\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m\n\u001b[32m   1760\u001b[39m     (\u001b[38;5;28mself\u001b[39m._jobs[\u001b[32m0\u001b[39m].get_status(\n\u001b[32m   1761\u001b[39m         timeout=\u001b[38;5;28mself\u001b[39m.timeout) == TASK_PENDING)):\n\u001b[32m-> \u001b[39m\u001b[32m1762\u001b[39m     \u001b[43mtime\u001b[49m\u001b[43m.\u001b[49m\u001b[43msleep\u001b[49m\u001b[43m(\u001b[49m\u001b[32;43m0.01\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m   1763\u001b[39m     \u001b[38;5;28;01mcontinue\u001b[39;00m\n",
      "\u001b[31mKeyboardInterrupt\u001b[39m: ",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[31mKeyboardInterrupt\u001b[39m                         Traceback (most recent call last)",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[17]\u001b[39m\u001b[32m, line 4\u001b[39m\n\u001b[32m      1\u001b[39m execfile(\u001b[33m'\u001b[39m\u001b[33myanmu_v3/v3_yinzi.py\u001b[39m\u001b[33m'\u001b[39m)\n\u001b[32m----> \u001b[39m\u001b[32m4\u001b[39m mpact_df = \u001b[43manalyze_feature_impact_optimized\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m      5\u001b[39m \u001b[43m    \u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mX_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my_train\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmodel_type\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mrecall\u001b[39;49m\u001b[33;43m'\u001b[39;49m\n\u001b[32m      6\u001b[39m \u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\Documents\\yanmuhengsheng\\yanmu_v3\\v3_yinzi.py:418\u001b[39m, in \u001b[36manalyze_feature_impact_optimized\u001b[39m\u001b[34m(model, X, y, model_type, n_jobs, sample_size)\u001b[39m\n\u001b[32m    414\u001b[39m         perm_score = perm_preds.mean()\n\u001b[32m    416\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m base_score - perm_score\n\u001b[32m--> \u001b[39m\u001b[32m418\u001b[39m permutation_scores = \u001b[43mParallel\u001b[49m\u001b[43m(\u001b[49m\u001b[43mn_jobs\u001b[49m\u001b[43m=\u001b[49m\u001b[43mn_jobs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m    419\u001b[39m \u001b[43m    \u001b[49m\u001b[43mdelayed\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpermutation_importance\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcol\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mcol\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mX_sampled\u001b[49m\u001b[43m.\u001b[49m\u001b[43mcolumns\u001b[49m\n\u001b[32m    420\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m    422\u001b[39m importance[\u001b[33m'\u001b[39m\u001b[33mpermutation_score\u001b[39m\u001b[33m'\u001b[39m] = permutation_scores\n\u001b[32m    424\u001b[39m \u001b[38;5;66;03m# 5. 特征稳定性计算\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\miniforge3\\Lib\\site-packages\\joblib\\parallel.py:2007\u001b[39m, in \u001b[36mParallel.__call__\u001b[39m\u001b[34m(self, iterable)\u001b[39m\n\u001b[32m   2001\u001b[39m \u001b[38;5;66;03m# The first item from the output is blank, but it makes the interpreter\u001b[39;00m\n\u001b[32m   2002\u001b[39m \u001b[38;5;66;03m# progress until it enters the Try/Except block of the generator and\u001b[39;00m\n\u001b[32m   2003\u001b[39m \u001b[38;5;66;03m# reaches the first `yield` statement. This starts the asynchronous\u001b[39;00m\n\u001b[32m   2004\u001b[39m \u001b[38;5;66;03m# dispatch of the tasks to the workers.\u001b[39;00m\n\u001b[32m   2005\u001b[39m \u001b[38;5;28mnext\u001b[39m(output)\n\u001b[32m-> \u001b[39m\u001b[32m2007\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m output \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.return_generator \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28;43mlist\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43moutput\u001b[49m\u001b[43m)\u001b[49m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\miniforge3\\Lib\\site-packages\\joblib\\parallel.py:1703\u001b[39m, in \u001b[36mParallel._get_outputs\u001b[39m\u001b[34m(self, iterator, pre_dispatch)\u001b[39m\n\u001b[32m   1701\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mBaseException\u001b[39;00m:\n\u001b[32m   1702\u001b[39m     \u001b[38;5;28mself\u001b[39m._exception = \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[32m-> \u001b[39m\u001b[32m1703\u001b[39m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_abort\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m   1704\u001b[39m     \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[32m   1705\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m   1706\u001b[39m     \u001b[38;5;66;03m# Store the unconsumed tasks and terminate the workers if necessary\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\miniforge3\\Lib\\site-packages\\joblib\\parallel.py:1614\u001b[39m, in \u001b[36mParallel._abort\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m   1609\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (\u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m._aborted \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(backend, \u001b[33m'\u001b[39m\u001b[33mabort_everything\u001b[39m\u001b[33m'\u001b[39m)):\n\u001b[32m   1610\u001b[39m     \u001b[38;5;66;03m# If the backend is managed externally we need to make sure\u001b[39;00m\n\u001b[32m   1611\u001b[39m     \u001b[38;5;66;03m# to leave it in a working state to allow for future jobs\u001b[39;00m\n\u001b[32m   1612\u001b[39m     \u001b[38;5;66;03m# scheduling.\u001b[39;00m\n\u001b[32m   1613\u001b[39m     ensure_ready = \u001b[38;5;28mself\u001b[39m._managed_backend\n\u001b[32m-> \u001b[39m\u001b[32m1614\u001b[39m     \u001b[43mbackend\u001b[49m\u001b[43m.\u001b[49m\u001b[43mabort_everything\u001b[49m\u001b[43m(\u001b[49m\u001b[43mensure_ready\u001b[49m\u001b[43m=\u001b[49m\u001b[43mensure_ready\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m   1615\u001b[39m \u001b[38;5;28mself\u001b[39m._aborted = \u001b[38;5;28;01mTrue\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\miniforge3\\Lib\\site-packages\\joblib\\_parallel_backends.py:620\u001b[39m, in \u001b[36mLokyBackend.abort_everything\u001b[39m\u001b[34m(self, ensure_ready)\u001b[39m\n\u001b[32m    617\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mabort_everything\u001b[39m(\u001b[38;5;28mself\u001b[39m, ensure_ready=\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[32m    618\u001b[39m \u001b[38;5;250m    \u001b[39m\u001b[33;03m\"\"\"Shutdown the workers and restart a new one with the same parameters\u001b[39;00m\n\u001b[32m    619\u001b[39m \u001b[33;03m    \"\"\"\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m620\u001b[39m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_workers\u001b[49m\u001b[43m.\u001b[49m\u001b[43mterminate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkill_workers\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[32m    621\u001b[39m     \u001b[38;5;28mself\u001b[39m._workers = \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[32m    623\u001b[39m     \u001b[38;5;28;01mif\u001b[39;00m ensure_ready:\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\miniforge3\\Lib\\site-packages\\joblib\\executor.py:75\u001b[39m, in \u001b[36mMemmappingExecutor.terminate\u001b[39m\u001b[34m(self, kill_workers)\u001b[39m\n\u001b[32m     73\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mterminate\u001b[39m(\u001b[38;5;28mself\u001b[39m, kill_workers=\u001b[38;5;28;01mFalse\u001b[39;00m):\n\u001b[32m---> \u001b[39m\u001b[32m75\u001b[39m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mshutdown\u001b[49m\u001b[43m(\u001b[49m\u001b[43mkill_workers\u001b[49m\u001b[43m=\u001b[49m\u001b[43mkill_workers\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m     77\u001b[39m     \u001b[38;5;66;03m# When workers are killed in a brutal manner, they cannot execute the\u001b[39;00m\n\u001b[32m     78\u001b[39m     \u001b[38;5;66;03m# finalizer of their shared memmaps. The refcount of those memmaps may\u001b[39;00m\n\u001b[32m     79\u001b[39m     \u001b[38;5;66;03m# be off by an unknown number, so instead of decref'ing them, we force\u001b[39;00m\n\u001b[32m   (...)\u001b[39m\u001b[32m     84\u001b[39m     \u001b[38;5;66;03m# with allow_non_empty=True but if we can't, it will be clean up later\u001b[39;00m\n\u001b[32m     85\u001b[39m     \u001b[38;5;66;03m# on by the resource_tracker.\u001b[39;00m\n\u001b[32m     86\u001b[39m     \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m._submit_resize_lock:\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\miniforge3\\Lib\\site-packages\\joblib\\externals\\loky\\process_executor.py:1303\u001b[39m, in \u001b[36mProcessPoolExecutor.shutdown\u001b[39m\u001b[34m(self, wait, kill_workers)\u001b[39m\n\u001b[32m   1299\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m executor_manager_thread \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m wait:\n\u001b[32m   1300\u001b[39m     \u001b[38;5;66;03m# This locks avoids concurrent join if the interpreter\u001b[39;00m\n\u001b[32m   1301\u001b[39m     \u001b[38;5;66;03m# is shutting down.\u001b[39;00m\n\u001b[32m   1302\u001b[39m     \u001b[38;5;28;01mwith\u001b[39;00m _global_shutdown_lock:\n\u001b[32m-> \u001b[39m\u001b[32m1303\u001b[39m         \u001b[43mexecutor_manager_thread\u001b[49m\u001b[43m.\u001b[49m\u001b[43mjoin\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m   1304\u001b[39m         _threads_wakeups.pop(executor_manager_thread, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[32m   1306\u001b[39m \u001b[38;5;66;03m# To reduce the risk of opening too many files, remove references to\u001b[39;00m\n\u001b[32m   1307\u001b[39m \u001b[38;5;66;03m# objects that use file descriptors.\u001b[39;00m\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\miniforge3\\Lib\\threading.py:1149\u001b[39m, in \u001b[36mThread.join\u001b[39m\u001b[34m(self, timeout)\u001b[39m\n\u001b[32m   1146\u001b[39m     \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(\u001b[33m\"\u001b[39m\u001b[33mcannot join current thread\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m   1148\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m timeout \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1149\u001b[39m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43m_wait_for_tstate_lock\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m   1150\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m   1151\u001b[39m     \u001b[38;5;66;03m# the behavior of a negative timeout isn't documented, but\u001b[39;00m\n\u001b[32m   1152\u001b[39m     \u001b[38;5;66;03m# historically .join(timeout=x) for x<0 has acted as if timeout=0\u001b[39;00m\n\u001b[32m   1153\u001b[39m     \u001b[38;5;28mself\u001b[39m._wait_for_tstate_lock(timeout=\u001b[38;5;28mmax\u001b[39m(timeout, \u001b[32m0\u001b[39m))\n",
      "\u001b[36mFile \u001b[39m\u001b[32m~\\miniforge3\\Lib\\threading.py:1169\u001b[39m, in \u001b[36mThread._wait_for_tstate_lock\u001b[39m\u001b[34m(self, block, timeout)\u001b[39m\n\u001b[32m   1166\u001b[39m     \u001b[38;5;28;01mreturn\u001b[39;00m\n\u001b[32m   1168\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1169\u001b[39m     \u001b[38;5;28;01mif\u001b[39;00m \u001b[43mlock\u001b[49m\u001b[43m.\u001b[49m\u001b[43macquire\u001b[49m\u001b[43m(\u001b[49m\u001b[43mblock\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimeout\u001b[49m\u001b[43m)\u001b[49m:\n\u001b[32m   1170\u001b[39m         lock.release()\n\u001b[32m   1171\u001b[39m         \u001b[38;5;28mself\u001b[39m._stop()\n",
      "\u001b[31mKeyboardInterrupt\u001b[39m: "
     ]
    }
   ],
   "source": [
    "execfile('yanmu_v3/v3_yinzi.py')\n",
    "\n",
    "\n",
    "mpact_df = analyze_feature_impact_optimized(\n",
    "    model, X_train, y_train, model_type='recall'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "6d6dc271-d0a9-47f9-a8b3-b9ea8aa336de",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:37:51.851977Z",
     "iopub.status.busy": "2025-07-02T12:37:51.850977Z",
     "iopub.status.idle": "2025-07-02T12:37:51.866524Z",
     "shell.execute_reply": "2025-07-02T12:37:51.866524Z",
     "shell.execute_reply.started": "2025-07-02T12:37:51.851977Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>gain</th>\n",
       "      <th>split</th>\n",
       "      <th>shap_mean</th>\n",
       "      <th>shap_std</th>\n",
       "      <th>permutation_score</th>\n",
       "      <th>stability</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>zs_is_zt</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>zs_gt4</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.002030</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>zs_gt4_num</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.008682</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>zs_gt9_num</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>is_zt</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.014847</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>143</th>\n",
       "      <td>pre_xl_yoy_1d</td>\n",
       "      <td>196217.033811</td>\n",
       "      <td>13145</td>\n",
       "      <td>0.839081</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.000873</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>144</th>\n",
       "      <td>t_rate_zscore</td>\n",
       "      <td>199868.645613</td>\n",
       "      <td>12905</td>\n",
       "      <td>0.854696</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000776</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>145</th>\n",
       "      <td>xl_concentration</td>\n",
       "      <td>211999.462613</td>\n",
       "      <td>13164</td>\n",
       "      <td>0.906571</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000256</td>\n",
       "      <td>-0.019340</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>turnover_yoy_1d</td>\n",
       "      <td>218284.791724</td>\n",
       "      <td>13756</td>\n",
       "      <td>0.933449</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.002729</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>147</th>\n",
       "      <td>xl_yoy_1d</td>\n",
       "      <td>233847.634248</td>\n",
       "      <td>15683</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.000234</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>148 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "              feature           gain  split  shap_mean  shap_std  \\\n",
       "0            zs_is_zt       0.000000      0   0.000000       0.0   \n",
       "1              zs_gt4       0.000000      0   0.000000       0.0   \n",
       "2          zs_gt4_num       0.000000      0   0.000000       0.0   \n",
       "3          zs_gt9_num       0.000000      0   0.000000       0.0   \n",
       "4               is_zt       0.000000      0   0.000000       0.0   \n",
       "..                ...            ...    ...        ...       ...   \n",
       "143     pre_xl_yoy_1d  196217.033811  13145   0.839081       0.0   \n",
       "144     t_rate_zscore  199868.645613  12905   0.854696       0.0   \n",
       "145  xl_concentration  211999.462613  13164   0.906571       0.0   \n",
       "146   turnover_yoy_1d  218284.791724  13756   0.933449       0.0   \n",
       "147         xl_yoy_1d  233847.634248  15683   1.000000       0.0   \n",
       "\n",
       "     permutation_score  stability  \n",
       "0             0.000000   0.000000  \n",
       "1             0.000000  -0.002030  \n",
       "2             0.000000  -0.008682  \n",
       "3             0.000000   0.000000  \n",
       "4             0.000000  -0.014847  \n",
       "..                 ...        ...  \n",
       "143          -0.000873   0.000000  \n",
       "144           0.000776   0.000000  \n",
       "145           0.000256  -0.019340  \n",
       "146           0.002729   0.000000  \n",
       "147          -0.000234   0.000000  \n",
       "\n",
       "[148 rows x 7 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# mpact_df.to_csv('output/analyze_feature_impact_optimized_recall.csv')\n",
    "mpact_df.sort_values(by=['gain']).reset_index(drop=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "64a8f68a-f157-4641-8f5a-454ed92935a3",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:39:05.772113Z",
     "iopub.status.busy": "2025-07-02T12:39:05.772113Z",
     "iopub.status.idle": "2025-07-02T12:39:05.781499Z",
     "shell.execute_reply": "2025-07-02T12:39:05.781460Z",
     "shell.execute_reply.started": "2025-07-02T12:39:05.772113Z"
    }
   },
   "outputs": [],
   "source": [
    "def filter_features(impact_df, recall_model=True):\n",
    "    \"\"\"\n",
    "    基于影响分析筛选特征\n",
    "    :param impact_df: 特征影响DataFrame\n",
    "    :param recall_model: 是否为召回率模型\n",
    "    :return: 筛选后的特征列表\n",
    "    \"\"\"\n",
    "    # 复制数据避免修改原始数据\n",
    "    df = impact_df.copy()\n",
    "    \n",
    "    # 计算各项指标的分位数\n",
    "    df['gain_quantile'] = df['gain'].rank(pct=True)\n",
    "    df['perm_quantile'] = df['permutation_score'].rank(pct=True)\n",
    "    df['stability_quantile'] = df['stability'].rank(pct=True)\n",
    "    \n",
    "    if recall_model:\n",
    "        # 召回率模型：保留高增益或高置换重要性的特征，容忍一定不稳定性\n",
    "        keep_condition = (\n",
    "            (df['permutation_score'] > 0) &  # 必须正置换重要性\n",
    "            (\n",
    "                (df['gain_quantile'] > 0.3) | \n",
    "                (df['perm_quantile'] > 0.4) |\n",
    "                (df['shap_mean'] > np.quantile(df['shap_mean'], 0.4))\n",
    "            )\n",
    "        )\n",
    "    else:\n",
    "        # 精准率模型：严格筛选，要求高稳定性和置换重要性\n",
    "        keep_condition = (\n",
    "            (df['permutation_score'] > 0) &  # 必须正置换重要性\n",
    "            (df['stability_quantile'] > 0.4) &  # 稳定性高于40%分位\n",
    "            (\n",
    "                (df['gain_quantile'] > 0.4) | \n",
    "                (df['perm_quantile'] > 0.5)\n",
    "            )\n",
    "        )\n",
    "    \n",
    "    return df[keep_condition]['feature'].tolist()\n",
    "\n",
    "# 使用示例\n",
    "recall_features = filter_features(mpact_df, recall_model=True)\n",
    "precision_features = filter_features(mpact_df, recall_model=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "26ba81cd-c65c-4ce0-a079-a6915a3c3964",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:52:40.297793Z",
     "iopub.status.busy": "2025-07-02T12:52:40.297793Z",
     "iopub.status.idle": "2025-07-02T14:11:35.817080Z",
     "shell.execute_reply": "2025-07-02T14:11:35.816035Z",
     "shell.execute_reply.started": "2025-07-02T12:52:40.297793Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "初始性能: 0.1042\n",
      "轮次 1: 特征数 148, 性能 0.1234\n",
      "✅ 性能提升至 0.1234\n",
      "轮次 2: 特征数 148, 性能 0.1234\n",
      "⛔ 性能未提升，恢复原特征集\n",
      "轮次 3: 特征数 148, 性能 0.1234\n",
      "⛔ 性能未提升，恢复原特征集\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "['zs_gt9',\n",
       " 'xl_vol_10d',\n",
       " 'h_w10',\n",
       " 'w_duo2',\n",
       " 'pre_turnover_yoy_1d',\n",
       " 'xl_net',\n",
       " 'xl_break_high',\n",
       " 'zs_gt4_num',\n",
       " 'turnover_score',\n",
       " 'xl_rate_ma_10d',\n",
       " 'zs_t_rate',\n",
       " 'd_duo',\n",
       " 'high',\n",
       " 'zs_bias15',\n",
       " 'r_d10_score',\n",
       " 'd_kong',\n",
       " 'zs_raise_buy',\n",
       " 'zs_m_raise',\n",
       " 'r1',\n",
       " 'xl_positive_days',\n",
       " 'ma8w',\n",
       " 'is_zt',\n",
       " 'score',\n",
       " 'zs_slope3',\n",
       " 'float_mv',\n",
       " 'zs_is_gt9',\n",
       " 'low',\n",
       " 'r5',\n",
       " 'gt7',\n",
       " 'xl_yoy_1d',\n",
       " 'h_d20',\n",
       " 'w_duo1',\n",
       " 'zs_close',\n",
       " 'zs_gt7',\n",
       " 'zs_pre_max_drop',\n",
       " 'bias3',\n",
       " 'xl_ratio',\n",
       " 'slope15w',\n",
       " 'zs_r2',\n",
       " 'xl_spike',\n",
       " 'zs_d_duo',\n",
       " 'd_turnover_max',\n",
       " 'gt7_num',\n",
       " 'bias15',\n",
       " 'quote_rate',\n",
       " 'pre_xl_ratio',\n",
       " 't_rate',\n",
       " 'r10',\n",
       " 'r2',\n",
       " 'xl_vol_3d',\n",
       " 'gt9',\n",
       " 'pre_t_rate',\n",
       " 'd10_max',\n",
       " 'zs_r1',\n",
       " 'h_w40',\n",
       " 'xl_push_eff',\n",
       " 'is_gt7',\n",
       " 'max_pct',\n",
       " 'zs_slope15',\n",
       " 'gt9_num',\n",
       " 'bias15w',\n",
       " 'turnover_break',\n",
       " 'bias5',\n",
       " 'xl_rate_ma_3d',\n",
       " 'ma15w',\n",
       " 'zs_is_gt7',\n",
       " 't_rate_zscore',\n",
       " 'zs_max_gain',\n",
       " 'zs_high_limit',\n",
       " 'pre_xl_yoy_1d',\n",
       " 'h_w20',\n",
       " 'xl_cumsum_3d',\n",
       " 'zs_gt9_num',\n",
       " 'ma3w',\n",
       " 'bias3w',\n",
       " 'xl_cumsum_10d',\n",
       " 'raise_buy',\n",
       " 'gt4_num',\n",
       " 'xl_price_div',\n",
       " 'zs_r15',\n",
       " 'turnover_yoy_1d',\n",
       " 'pre_max_gain',\n",
       " 'raise_score',\n",
       " 'slope15',\n",
       " 'slope3',\n",
       " 'xl_concentration',\n",
       " 'zs_volume',\n",
       " 'pre_max_drop',\n",
       " 'zt_num',\n",
       " 'slope5',\n",
       " 'zs_open',\n",
       " 'zs_w_raise',\n",
       " 'xl_rate_ma_5d',\n",
       " 'slope3w',\n",
       " 'zs_gt7_num',\n",
       " 'zs_quote_rate',\n",
       " 'slope250',\n",
       " 'zs_amp_rate',\n",
       " 'r15',\n",
       " 'h_d40',\n",
       " 'bias5w',\n",
       " 'bias120',\n",
       " 'bias250',\n",
       " 'zs_slope120',\n",
       " 'xl_t_rate',\n",
       " 'close',\n",
       " 'is_gt4',\n",
       " 'h_d60',\n",
       " 'm_raise',\n",
       " 'zs_slope5',\n",
       " 'gt4',\n",
       " 'zs_high',\n",
       " 'open',\n",
       " 'slope5w',\n",
       " 'h_w30',\n",
       " 'w_raise',\n",
       " 'zs_zt_num',\n",
       " 'slope120',\n",
       " 'max_drop',\n",
       " 'zs_slope250',\n",
       " 'zs_d_kong',\n",
       " 'zs_low',\n",
       " 'zs_zt_num_20',\n",
       " 'zs_max_drop',\n",
       " 'xl',\n",
       " 'xl_cumsum_5d',\n",
       " 'xl_vol_5d',\n",
       " 'zs_pre_r1',\n",
       " 'zs_bias3',\n",
       " 'zs_gt4',\n",
       " 'xl_rate',\n",
       " 'final_score',\n",
       " 'ma5w',\n",
       " 'pre_r1',\n",
       " 'zs_bias5',\n",
       " 'zs_pre_t_rate',\n",
       " 'zs_is_zt',\n",
       " 'zs_turnover',\n",
       " 'zs_is_gt4',\n",
       " 'zs_r5',\n",
       " 'max_gain',\n",
       " 'zs_bias250',\n",
       " 'turnover',\n",
       " 'zs_r10',\n",
       " 'zt_num_20',\n",
       " 'zs_pre_max_gain',\n",
       " 'zs_bias120',\n",
       " 'is_gt9']"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# eliminate_negative_features(model, X_train, y_train,model_type='recall',mpact_df,n_rounds=3)\n",
    "eliminate_negative_features(model, X_train, y_train, 'recall', mpact_df, 3)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "b33409fa-c865-4b1b-be84-d6bba5f70746",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-07-02T12:50:02.279526Z",
     "iopub.status.busy": "2025-07-02T12:50:02.278525Z",
     "iopub.status.idle": "2025-07-02T12:50:02.289388Z",
     "shell.execute_reply": "2025-07-02T12:50:02.288875Z",
     "shell.execute_reply.started": "2025-07-02T12:50:02.279526Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>gain</th>\n",
       "      <th>split</th>\n",
       "      <th>shap_mean</th>\n",
       "      <th>shap_std</th>\n",
       "      <th>permutation_score</th>\n",
       "      <th>stability</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>t_rate</td>\n",
       "      <td>171413.698280</td>\n",
       "      <td>11492</td>\n",
       "      <td>0.733014</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.002909</td>\n",
       "      <td>-0.091517</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>88</th>\n",
       "      <td>turnover_yoy_1d</td>\n",
       "      <td>218284.791724</td>\n",
       "      <td>13756</td>\n",
       "      <td>0.933449</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.002729</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>pre_t_rate</td>\n",
       "      <td>157335.977007</td>\n",
       "      <td>9865</td>\n",
       "      <td>0.672814</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.002568</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>120</th>\n",
       "      <td>zs_bias3</td>\n",
       "      <td>93311.088303</td>\n",
       "      <td>5265</td>\n",
       "      <td>0.399025</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001915</td>\n",
       "      <td>-0.090654</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>h_w20</td>\n",
       "      <td>122826.323106</td>\n",
       "      <td>7785</td>\n",
       "      <td>0.525241</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.001816</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>bias15w</td>\n",
       "      <td>112249.048167</td>\n",
       "      <td>7265</td>\n",
       "      <td>0.480009</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.000754</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>91</th>\n",
       "      <td>pre_xl_yoy_1d</td>\n",
       "      <td>196217.033811</td>\n",
       "      <td>13145</td>\n",
       "      <td>0.839081</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.000873</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>xl_vol_10d</td>\n",
       "      <td>78612.046251</td>\n",
       "      <td>5340</td>\n",
       "      <td>0.336168</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.001018</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>r15</td>\n",
       "      <td>132566.956342</td>\n",
       "      <td>8816</td>\n",
       "      <td>0.566895</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.001110</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>136</th>\n",
       "      <td>zs_turnover</td>\n",
       "      <td>114252.820894</td>\n",
       "      <td>7435</td>\n",
       "      <td>0.488578</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.001715</td>\n",
       "      <td>-0.142960</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>148 rows × 7 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             feature           gain  split  shap_mean  shap_std  \\\n",
       "6             t_rate  171413.698280  11492   0.733014       0.0   \n",
       "88   turnover_yoy_1d  218284.791724  13756   0.933449       0.0   \n",
       "39        pre_t_rate  157335.977007   9865   0.672814       0.0   \n",
       "120         zs_bias3   93311.088303   5265   0.399025       0.0   \n",
       "11             h_w20  122826.323106   7785   0.525241       0.0   \n",
       "..               ...            ...    ...        ...       ...   \n",
       "61           bias15w  112249.048167   7265   0.480009       0.0   \n",
       "91     pre_xl_yoy_1d  196217.033811  13145   0.839081       0.0   \n",
       "78        xl_vol_10d   78612.046251   5340   0.336168       0.0   \n",
       "23               r15  132566.956342   8816   0.566895       0.0   \n",
       "136      zs_turnover  114252.820894   7435   0.488578       0.0   \n",
       "\n",
       "     permutation_score  stability  \n",
       "6             0.002909  -0.091517  \n",
       "88            0.002729   0.000000  \n",
       "39            0.002568   0.000000  \n",
       "120           0.001915  -0.090654  \n",
       "11            0.001816   0.000000  \n",
       "..                 ...        ...  \n",
       "61           -0.000754   0.000000  \n",
       "91           -0.000873   0.000000  \n",
       "78           -0.001018   0.000000  \n",
       "23           -0.001110   0.000000  \n",
       "136          -0.001715  -0.142960  \n",
       "\n",
       "[148 rows x 7 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# precision_features\n",
    "mpact_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f5dd3a1b-23fd-4a89-85f4-82bb050f2a36",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4abbd427-0f9f-4181-a297-0d23fd913ed4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9e54a2b0-9abd-45cf-8ea4-aa801f8fcfce",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4319d8e2-2001-4bfb-b528-ec673db0f320",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "7e8c5465-0e5f-4dfe-b38b-b5434d5670b0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-03T14:13:55.068396Z",
     "iopub.status.busy": "2025-05-03T14:13:55.067396Z",
     "iopub.status.idle": "2025-05-03T14:14:02.122800Z",
     "shell.execute_reply": "2025-05-03T14:14:02.121797Z",
     "shell.execute_reply.started": "2025-05-03T14:13:55.068396Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3745388 \n",
      "   Index(['date', 'code', 'h_w10', 'h_w20', 'h_w30', 'h_w40', 'h_d20', 'h_d40',\n",
      "       'h_d60', 'r1',\n",
      "       ...\n",
      "       'zs_open', 'zs_high', 'zs_low', 'zs_close', 'zs_volume', 'zs_turnover',\n",
      "       'zs_t_rate', 'zs_quote_rate', 'zs_high_limit', 'ret3'],\n",
      "      dtype='object', length=119)\n",
      "36105 \n",
      "   Index(['date', 'code', 'h_w10', 'h_w20', 'h_w30', 'h_w40', 'h_d20', 'h_d40',\n",
      "       'h_d60', 'r1',\n",
      "       ...\n",
      "       'zs_open', 'zs_high', 'zs_low', 'zs_close', 'zs_volume', 'zs_turnover',\n",
      "       'zs_t_rate', 'zs_quote_rate', 'zs_high_limit', 'ret3'],\n",
      "      dtype='object', length=119)\n"
     ]
    }
   ],
   "source": [
    "f_l_df = filter_10cm(train_df)\n",
    "p_col_len(f_l_df)\n",
    "\n",
    "f_l_df = f_l_df.dropna(subset=['r15'])\n",
    "f_l_df = f_l_df[f_l_df['raise_buy'] < 4]\n",
    "f_l_df = f_l_df[f_l_df['is_zt'] & (f_l_df['zt_num'] <2)]\n",
    "p_col_len(f_l_df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f954952d-a2bf-49c0-a79a-014a7101afd7",
   "metadata": {},
   "source": [
    "#### 一、股价因子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "id": "fbb79e9b-416a-429a-a939-cc4808f8a0bb",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-03T14:14:02.124801Z",
     "iopub.status.busy": "2025-05-03T14:14:02.123801Z",
     "iopub.status.idle": "2025-05-03T14:14:02.127655Z",
     "shell.execute_reply": "2025-05-03T14:14:02.127655Z",
     "shell.execute_reply.started": "2025-05-03T14:14:02.124801Z"
    }
   },
   "outputs": [],
   "source": [
    "# filtered_columns = [col for col in f_l_df.columns if col not in ['date', 'code','ret3'] and not col.startswith('zs_')]\n",
    "# print(filtered_columns)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "e146b1e6-c7fd-4af5-8100-d4b5495d84a0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-03T14:14:03.655682Z",
     "iopub.status.busy": "2025-05-03T14:14:03.654680Z",
     "iopub.status.idle": "2025-05-03T14:14:03.660678Z",
     "shell.execute_reply": "2025-05-03T14:14:03.660678Z",
     "shell.execute_reply.started": "2025-05-03T14:14:03.655682Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "无分箱区间列\n"
     ]
    }
   ],
   "source": [
    "# 筛选区间类型列\n",
    "interval_columns = f_l_df.select_dtypes(include=['interval', 'category']).columns.tolist()\n",
    "\n",
    "# 输出结果\n",
    "if interval_columns:\n",
    "    print(\"存在分箱区间列:\", interval_columns)\n",
    "else:\n",
    "    print(\"无分箱区间列\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "587c476b-9d06-4c0a-8861-d4562955168f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-03T14:14:09.723900Z",
     "iopub.status.busy": "2025-05-03T14:14:09.722899Z",
     "iopub.status.idle": "2025-05-03T14:14:09.726342Z",
     "shell.execute_reply": "2025-05-03T14:14:09.726342Z",
     "shell.execute_reply.started": "2025-05-03T14:14:09.723900Z"
    }
   },
   "outputs": [],
   "source": [
    "# f_l_df.dtypes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "24deb29d-b4f4-41cd-b0c7-7c0274de4b1d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-03T14:15:13.984834Z",
     "iopub.status.busy": "2025-05-03T14:15:13.984834Z",
     "iopub.status.idle": "2025-05-03T14:15:33.670754Z",
     "shell.execute_reply": "2025-05-03T14:15:33.670754Z",
     "shell.execute_reply.started": "2025-05-03T14:15:13.984834Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>mi_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>101</th>\n",
       "      <td>zs_slope5</td>\n",
       "      <td>0.101966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>107</th>\n",
       "      <td>zs_open</td>\n",
       "      <td>0.101396</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>115</th>\n",
       "      <td>zs_high_limit</td>\n",
       "      <td>0.100064</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>111</th>\n",
       "      <td>zs_volume</td>\n",
       "      <td>0.099350</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>112</th>\n",
       "      <td>zs_turnover</td>\n",
       "      <td>0.099187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>67</th>\n",
       "      <td>xl_positive_days</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>83</th>\n",
       "      <td>zs_gt9</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87</th>\n",
       "      <td>zs_is_gt9</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>91</th>\n",
       "      <td>zs_gt9_num</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>85</th>\n",
       "      <td>zs_is_gt4</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>116 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "              feature  mi_score\n",
       "101         zs_slope5  0.101966\n",
       "107           zs_open  0.101396\n",
       "115     zs_high_limit  0.100064\n",
       "111         zs_volume  0.099350\n",
       "112       zs_turnover  0.099187\n",
       "..                ...       ...\n",
       "67   xl_positive_days  0.000000\n",
       "83             zs_gt9  0.000000\n",
       "87          zs_is_gt9  0.000000\n",
       "91         zs_gt9_num  0.000000\n",
       "85          zs_is_gt4  0.000000\n",
       "\n",
       "[116 rows x 2 columns]"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "execfile('yanmu_v3/v3_yinzi.py')\n",
    "mi_result = mutual_info_analysis(f_l_df)\n",
    "mi_result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "85834994-19d2-4479-9ccc-cb2b159b16bf",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-03T14:16:02.093596Z",
     "iopub.status.busy": "2025-05-03T14:16:02.092597Z",
     "iopub.status.idle": "2025-05-03T14:16:02.101608Z",
     "shell.execute_reply": "2025-05-03T14:16:02.101608Z",
     "shell.execute_reply.started": "2025-05-03T14:16:02.093596Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>mi_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>101</th>\n",
       "      <td>zs_slope5</td>\n",
       "      <td>0.101966</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>107</th>\n",
       "      <td>zs_open</td>\n",
       "      <td>0.101396</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>115</th>\n",
       "      <td>zs_high_limit</td>\n",
       "      <td>0.100064</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>111</th>\n",
       "      <td>zs_volume</td>\n",
       "      <td>0.099350</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>112</th>\n",
       "      <td>zs_turnover</td>\n",
       "      <td>0.099187</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100</th>\n",
       "      <td>zs_slope3</td>\n",
       "      <td>0.098960</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>108</th>\n",
       "      <td>zs_high</td>\n",
       "      <td>0.094243</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>102</th>\n",
       "      <td>zs_slope15</td>\n",
       "      <td>0.094100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>110</th>\n",
       "      <td>zs_close</td>\n",
       "      <td>0.093579</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>zs_bias120</td>\n",
       "      <td>0.093457</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>109</th>\n",
       "      <td>zs_low</td>\n",
       "      <td>0.091003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>zs_r10</td>\n",
       "      <td>0.089882</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80</th>\n",
       "      <td>zs_r15</td>\n",
       "      <td>0.089611</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>zs_bias5</td>\n",
       "      <td>0.087700</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>zs_r1</td>\n",
       "      <td>0.087607</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99</th>\n",
       "      <td>zs_bias250</td>\n",
       "      <td>0.087172</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94</th>\n",
       "      <td>zs_w_raise</td>\n",
       "      <td>0.085498</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>zs_bias15</td>\n",
       "      <td>0.084469</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>zs_r2</td>\n",
       "      <td>0.083925</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114</th>\n",
       "      <td>zs_quote_rate</td>\n",
       "      <td>0.082693</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>zs_r5</td>\n",
       "      <td>0.082480</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>zs_m_raise</td>\n",
       "      <td>0.081377</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>103</th>\n",
       "      <td>zs_slope120</td>\n",
       "      <td>0.079732</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>zs_bias3</td>\n",
       "      <td>0.076239</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>104</th>\n",
       "      <td>zs_slope250</td>\n",
       "      <td>0.075718</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>zs_amp_rate</td>\n",
       "      <td>0.063839</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113</th>\n",
       "      <td>zs_t_rate</td>\n",
       "      <td>0.040152</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>r15</td>\n",
       "      <td>0.031539</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>bias15</td>\n",
       "      <td>0.029665</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>bias5w</td>\n",
       "      <td>0.028003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>r10</td>\n",
       "      <td>0.023271</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>70</th>\n",
       "      <td>t_rate_zscore</td>\n",
       "      <td>0.022490</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>bias120</td>\n",
       "      <td>0.022379</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>r5</td>\n",
       "      <td>0.022064</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43</th>\n",
       "      <td>bias15w</td>\n",
       "      <td>0.021575</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>xl_ratio</td>\n",
       "      <td>0.020857</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>73</th>\n",
       "      <td>volume_yoy_1d</td>\n",
       "      <td>0.020549</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>m_raise</td>\n",
       "      <td>0.020527</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>bias3</td>\n",
       "      <td>0.019772</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>72</th>\n",
       "      <td>turnover_yoy_1d</td>\n",
       "      <td>0.018762</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             feature  mi_score\n",
       "101        zs_slope5  0.101966\n",
       "107          zs_open  0.101396\n",
       "115    zs_high_limit  0.100064\n",
       "111        zs_volume  0.099350\n",
       "112      zs_turnover  0.099187\n",
       "100        zs_slope3  0.098960\n",
       "108          zs_high  0.094243\n",
       "102       zs_slope15  0.094100\n",
       "110         zs_close  0.093579\n",
       "98        zs_bias120  0.093457\n",
       "109           zs_low  0.091003\n",
       "79            zs_r10  0.089882\n",
       "80            zs_r15  0.089611\n",
       "96          zs_bias5  0.087700\n",
       "76             zs_r1  0.087607\n",
       "99        zs_bias250  0.087172\n",
       "94        zs_w_raise  0.085498\n",
       "97         zs_bias15  0.084469\n",
       "77             zs_r2  0.083925\n",
       "114    zs_quote_rate  0.082693\n",
       "78             zs_r5  0.082480\n",
       "93        zs_m_raise  0.081377\n",
       "103      zs_slope120  0.079732\n",
       "95          zs_bias3  0.076239\n",
       "104      zs_slope250  0.075718\n",
       "75       zs_amp_rate  0.063839\n",
       "113        zs_t_rate  0.040152\n",
       "11               r15  0.031539\n",
       "28            bias15  0.029665\n",
       "42            bias5w  0.028003\n",
       "10               r10  0.023271\n",
       "70     t_rate_zscore  0.022490\n",
       "29           bias120  0.022379\n",
       "9                 r5  0.022064\n",
       "43           bias15w  0.021575\n",
       "51          xl_ratio  0.020857\n",
       "73     volume_yoy_1d  0.020549\n",
       "24           m_raise  0.020527\n",
       "26             bias3  0.019772\n",
       "72   turnover_yoy_1d  0.018762"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mi_result.sort_values('mi_score',ascending=False)[:40]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "925abf85-a813-4ac1-b97e-ffef66b0ec06",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-03T14:17:04.502808Z",
     "iopub.status.busy": "2025-05-03T14:17:04.501811Z",
     "iopub.status.idle": "2025-05-03T14:17:05.014729Z",
     "shell.execute_reply": "2025-05-03T14:17:05.014729Z",
     "shell.execute_reply.started": "2025-05-03T14:17:04.502808Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "yanmu_v3/v3_yinzi.py:52: ConstantInputWarning: An input array is constant; the correlation coefficient is not defined.\n",
      "  continue\n",
      "yanmu_v3/v3_yinzi.py:52: ConstantInputWarning: An input array is constant; the correlation coefficient is not defined.\n",
      "  continue\n",
      "yanmu_v3/v3_yinzi.py:52: ConstantInputWarning: An input array is constant; the correlation coefficient is not defined.\n",
      "  continue\n",
      "yanmu_v3/v3_yinzi.py:52: ConstantInputWarning: An input array is constant; the correlation coefficient is not defined.\n",
      "  continue\n",
      "yanmu_v3/v3_yinzi.py:52: ConstantInputWarning: An input array is constant; the correlation coefficient is not defined.\n",
      "  continue\n",
      "yanmu_v3/v3_yinzi.py:52: ConstantInputWarning: An input array is constant; the correlation coefficient is not defined.\n",
      "  continue\n",
      "yanmu_v3/v3_yinzi.py:52: ConstantInputWarning: An input array is constant; the correlation coefficient is not defined.\n",
      "  continue\n",
      "yanmu_v3/v3_yinzi.py:52: ConstantInputWarning: An input array is constant; the correlation coefficient is not defined.\n",
      "  continue\n",
      "yanmu_v3/v3_yinzi.py:52: ConstantInputWarning: An input array is constant; the correlation coefficient is not defined.\n",
      "  continue\n",
      "yanmu_v3/v3_yinzi.py:52: ConstantInputWarning: An input array is constant; the correlation coefficient is not defined.\n",
      "  continue\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>spearman_corr</th>\n",
       "      <th>p_value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>zs_bias3</td>\n",
       "      <td>0.128163</td>\n",
       "      <td>1.117537e-131</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>zs_r1</td>\n",
       "      <td>0.124757</td>\n",
       "      <td>8.004719e-125</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114</th>\n",
       "      <td>zs_quote_rate</td>\n",
       "      <td>0.124716</td>\n",
       "      <td>9.624906e-125</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>zs_r2</td>\n",
       "      <td>0.114985</td>\n",
       "      <td>3.296933e-106</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69</th>\n",
       "      <td>turnover_break</td>\n",
       "      <td>-0.108063</td>\n",
       "      <td>5.841324e-94</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>83</th>\n",
       "      <td>zs_gt9</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>84</th>\n",
       "      <td>zs_is_zt</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87</th>\n",
       "      <td>zs_is_gt9</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>88</th>\n",
       "      <td>zs_zt_num</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>91</th>\n",
       "      <td>zs_gt9_num</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>116 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            feature  spearman_corr        p_value\n",
       "95         zs_bias3       0.128163  1.117537e-131\n",
       "76            zs_r1       0.124757  8.004719e-125\n",
       "114   zs_quote_rate       0.124716  9.624906e-125\n",
       "77            zs_r2       0.114985  3.296933e-106\n",
       "69   turnover_break      -0.108063   5.841324e-94\n",
       "..              ...            ...            ...\n",
       "83           zs_gt9            NaN            NaN\n",
       "84         zs_is_zt            NaN            NaN\n",
       "87        zs_is_gt9            NaN            NaN\n",
       "88        zs_zt_num            NaN            NaN\n",
       "91       zs_gt9_num            NaN            NaN\n",
       "\n",
       "[116 rows x 3 columns]"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "execfile('yanmu_v3/v3_yinzi.py')\n",
    "spearman_result = spearman_analysis(f_l_df)\n",
    "spearman_result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "id": "c10e995f-108c-41ff-afa9-f5774efd8d17",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-03T14:18:10.363454Z",
     "iopub.status.busy": "2025-05-03T14:18:10.362454Z",
     "iopub.status.idle": "2025-05-03T14:18:10.372468Z",
     "shell.execute_reply": "2025-05-03T14:18:10.372468Z",
     "shell.execute_reply.started": "2025-05-03T14:18:10.363454Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>spearman_corr</th>\n",
       "      <th>p_value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>zs_bias3</td>\n",
       "      <td>0.128163</td>\n",
       "      <td>1.117537e-131</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>zs_r1</td>\n",
       "      <td>0.124757</td>\n",
       "      <td>8.004719e-125</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>114</th>\n",
       "      <td>zs_quote_rate</td>\n",
       "      <td>0.124716</td>\n",
       "      <td>9.624906e-125</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>77</th>\n",
       "      <td>zs_r2</td>\n",
       "      <td>0.114985</td>\n",
       "      <td>3.296933e-106</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>d_kong</td>\n",
       "      <td>0.091668</td>\n",
       "      <td>4.963123e-68</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>zs_amp_rate</td>\n",
       "      <td>0.088642</td>\n",
       "      <td>1.024367e-63</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>zs_bias5</td>\n",
       "      <td>0.084848</td>\n",
       "      <td>1.636686e-58</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94</th>\n",
       "      <td>zs_w_raise</td>\n",
       "      <td>0.066429</td>\n",
       "      <td>1.687363e-36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100</th>\n",
       "      <td>zs_slope3</td>\n",
       "      <td>0.065157</td>\n",
       "      <td>3.547967e-35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>113</th>\n",
       "      <td>zs_t_rate</td>\n",
       "      <td>0.048938</td>\n",
       "      <td>1.532029e-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>62</th>\n",
       "      <td>xl_price_div</td>\n",
       "      <td>0.048853</td>\n",
       "      <td>1.784385e-20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>raise_buy</td>\n",
       "      <td>0.044692</td>\n",
       "      <td>2.181668e-17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>111</th>\n",
       "      <td>zs_volume</td>\n",
       "      <td>0.036913</td>\n",
       "      <td>2.453048e-12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>112</th>\n",
       "      <td>zs_turnover</td>\n",
       "      <td>0.035042</td>\n",
       "      <td>2.917690e-11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>40</th>\n",
       "      <td>ma15w</td>\n",
       "      <td>0.024084</td>\n",
       "      <td>4.915920e-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>67</th>\n",
       "      <td>xl_positive_days</td>\n",
       "      <td>0.023277</td>\n",
       "      <td>1.000559e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>106</th>\n",
       "      <td>zs_d_kong</td>\n",
       "      <td>0.020510</td>\n",
       "      <td>9.952338e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>66</th>\n",
       "      <td>xl_t_rate</td>\n",
       "      <td>0.020236</td>\n",
       "      <td>1.231721e-04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39</th>\n",
       "      <td>ma5w</td>\n",
       "      <td>0.018533</td>\n",
       "      <td>4.392705e-04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>38</th>\n",
       "      <td>ma3w</td>\n",
       "      <td>0.016121</td>\n",
       "      <td>2.231494e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>zs_m_raise</td>\n",
       "      <td>0.014088</td>\n",
       "      <td>7.515570e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>zs_r5</td>\n",
       "      <td>0.013975</td>\n",
       "      <td>8.011302e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>zs_bias15</td>\n",
       "      <td>0.013386</td>\n",
       "      <td>1.109154e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>101</th>\n",
       "      <td>zs_slope5</td>\n",
       "      <td>0.013171</td>\n",
       "      <td>1.245070e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>xl_push_eff</td>\n",
       "      <td>0.010176</td>\n",
       "      <td>5.351818e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>74</th>\n",
       "      <td>xl_yoy_1d</td>\n",
       "      <td>0.007860</td>\n",
       "      <td>2.066492e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>49</th>\n",
       "      <td>xl_rate</td>\n",
       "      <td>0.005210</td>\n",
       "      <td>3.229413e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51</th>\n",
       "      <td>xl_ratio</td>\n",
       "      <td>0.005210</td>\n",
       "      <td>3.229413e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>81</th>\n",
       "      <td>zs_gt4</td>\n",
       "      <td>0.004082</td>\n",
       "      <td>4.386956e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>89</th>\n",
       "      <td>zs_gt4_num</td>\n",
       "      <td>0.002038</td>\n",
       "      <td>6.989546e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>xl_rate_ma_3d</td>\n",
       "      <td>0.001074</td>\n",
       "      <td>8.385877e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>92</th>\n",
       "      <td>zs_raise_buy</td>\n",
       "      <td>-0.003027</td>\n",
       "      <td>5.657607e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>xl_rate_ma_5d</td>\n",
       "      <td>-0.004596</td>\n",
       "      <td>3.832797e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>xl_rate_ma_10d</td>\n",
       "      <td>-0.008741</td>\n",
       "      <td>9.731235e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>105</th>\n",
       "      <td>zs_d_duo</td>\n",
       "      <td>-0.011716</td>\n",
       "      <td>2.621928e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>gt4_num</td>\n",
       "      <td>-0.012213</td>\n",
       "      <td>2.049198e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>r1</td>\n",
       "      <td>-0.013007</td>\n",
       "      <td>1.358520e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>63</th>\n",
       "      <td>xl_spike</td>\n",
       "      <td>-0.013742</td>\n",
       "      <td>9.124987e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>65</th>\n",
       "      <td>xl_concentration</td>\n",
       "      <td>-0.016600</td>\n",
       "      <td>1.634201e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>zs_r10</td>\n",
       "      <td>-0.018092</td>\n",
       "      <td>5.970498e-04</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              feature  spearman_corr        p_value\n",
       "95           zs_bias3       0.128163  1.117537e-131\n",
       "76              zs_r1       0.124757  8.004719e-125\n",
       "114     zs_quote_rate       0.124716  9.624906e-125\n",
       "77              zs_r2       0.114985  3.296933e-106\n",
       "37             d_kong       0.091668   4.963123e-68\n",
       "75        zs_amp_rate       0.088642   1.024367e-63\n",
       "96           zs_bias5       0.084848   1.636686e-58\n",
       "94         zs_w_raise       0.066429   1.687363e-36\n",
       "100         zs_slope3       0.065157   3.547967e-35\n",
       "113         zs_t_rate       0.048938   1.532029e-20\n",
       "62       xl_price_div       0.048853   1.784385e-20\n",
       "23          raise_buy       0.044692   2.181668e-17\n",
       "111         zs_volume       0.036913   2.453048e-12\n",
       "112       zs_turnover       0.035042   2.917690e-11\n",
       "40              ma15w       0.024084   4.915920e-06\n",
       "67   xl_positive_days       0.023277   1.000559e-05\n",
       "106         zs_d_kong       0.020510   9.952338e-05\n",
       "66          xl_t_rate       0.020236   1.231721e-04\n",
       "39               ma5w       0.018533   4.392705e-04\n",
       "38               ma3w       0.016121   2.231494e-03\n",
       "93         zs_m_raise       0.014088   7.515570e-03\n",
       "78              zs_r5       0.013975   8.011302e-03\n",
       "97          zs_bias15       0.013386   1.109154e-02\n",
       "101         zs_slope5       0.013171   1.245070e-02\n",
       "61        xl_push_eff       0.010176   5.351818e-02\n",
       "74          xl_yoy_1d       0.007860   2.066492e-01\n",
       "49            xl_rate       0.005210   3.229413e-01\n",
       "51           xl_ratio       0.005210   3.229413e-01\n",
       "81             zs_gt4       0.004082   4.386956e-01\n",
       "89         zs_gt4_num       0.002038   6.989546e-01\n",
       "53      xl_rate_ma_3d       0.001074   8.385877e-01\n",
       "92       zs_raise_buy      -0.003027   5.657607e-01\n",
       "56      xl_rate_ma_5d      -0.004596   3.832797e-01\n",
       "59     xl_rate_ma_10d      -0.008741   9.731235e-02\n",
       "105          zs_d_duo      -0.011716   2.621928e-02\n",
       "20            gt4_num      -0.012213   2.049198e-02\n",
       "7                  r1      -0.013007   1.358520e-02\n",
       "63           xl_spike      -0.013742   9.124987e-03\n",
       "65   xl_concentration      -0.016600   1.634201e-03\n",
       "79             zs_r10      -0.018092   5.970498e-04"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spearman_result.sort_values('spearman_corr',ascending=False)[:40]\n",
    "# analysis_result.sort_values('p值',)[:30]\n",
    "\n",
    "# analysis_result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c03836d9-d386-44f0-a06a-c54070357335",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "8df2db39-4207-4f0d-8a95-8fae46ccd3f1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2025-05-03T13:14:54.577354Z",
     "iopub.status.busy": "2025-05-03T13:14:54.576356Z",
     "iopub.status.idle": "2025-05-03T13:14:54.682255Z",
     "shell.execute_reply": "2025-05-03T13:14:54.682255Z",
     "shell.execute_reply.started": "2025-05-03T13:14:54.577354Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\x\\AppData\\Local\\Temp\\ipykernel_11252\\2044925655.py:3: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n",
      "  bin_ret = f_l_df.groupby('close_bin')['ret3'].mean()\n"
     ]
    },
    {
     "data": {
      "image/png": "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qhKYUoVsAtCD8e6KoiiKoighUKEqgVFNlaIoiqIkDypUJTCl1adKURRFUZIGFaqSQlOlQpWiKIqiJDoqVCVDAlAVqhRFURQl4VGhKhk0VWr+UxRFUZSEJ25C1bx586R169ZSsmRJGTBggHg8oUuxfPLJJ1K9enWpVKmSfPDBB97Xjx49KjfffLMUK1ZMChUqJH369JEjR45k+u6+ffukVq1a8umnn0qyoPX/FEVRFCV5iItQdfDgQenRo4e0bNlSZsyYIQsWLJCRI0eGFMKuvPJKGThwoEyYMEEGDRokixcvNu899dRTMmvWLJk2bZpMmTJFxo0bJyNGjMj0/UceeUROOOEE6dmzpyQLJTPMf+pTpSiKoiiJT1yEqvHjx8vOnTtlyJAhUrt2bRk8eLAMHz486Hfefvtt6dixo9xwww3SuHFj6devn4wePdq8t2XLFhkzZow0aNBAmjVrJt26dTNClmX27Nny6quvyssvvyzJhNVU7TpwRA4fPRbv7iiKoiiKkmhCFUJO27ZtjakOmjRpYrRVob7TqVMn799t2rSRmTNnmt9feOEFY9qzoMGqU6eO+R2z4o033iinnHKKTJ061bQTSou2a9euTD/xonjBvJIrV/rvmlZBURRFURKbuAhVCCo1a9b0/p0rVy5JS0uT7du3u/4O/lPr168/7nMTJ040psJevXqZvz/88EP5448/pFy5ckbYQov17LPPBjzOk08+KcWLF/f+VK1aVeJFWu5cUqJgelb17ZoAVFEURVESmrgIVXny5JH8+fNneq1AgQLGmdztd/x9fu/evcZJ/eGHH5ayZcua19588025+OKL5f333zcC08cffywPPfSQ7N692+9x7r//fmOatD9r1qyReKK5qhRFURQlOYiLUFWqVCnZvHlzptcQcvLly+f6O/4+j59VtWrV5O677/a+tnbtWjnnnHO8f7do0UIOHToUUFhCcEML5vyJJ5pVXVEURVGSg7gIVaRSwL/JsmLFCuPLhODk9js4oleuXNn797Bhw+T77783qRZy5/7vtKpUqSL79+/3/r1q1SpjbqxYsaIkAxoBqCiKoijJQVyEqvbt2xsfKZv2gOi/zp07G7+qHTt2mLxTvpAKYezYsTJ37lzZs2ePDB06VLp27er1o7rrrrtk1KhRUrhwYfO+FaQuv/xy40OFX9XSpUvltttuM35V5MdKBjRXlaIoiqIkB3nictA8eUyKBAQeEn+iWZo0aZJ5D2EHLRSpEZw0bdpUbr/9dmnVqpXxpyK6r2/fvuY9BCw0XV26dPF+vkOHDqZNUjCQcgG/KsyH7dq1C5m+IZHQrOqKoiiKkhzk8rhJZR4jNmzYYNIikF6hdOnSrr5D6oV169YZoSmYD1a0QKNGFCBO6/Hwr3rr13/kiW8XyvnNKsmLlzXP9uMriqIoSjKyKw7P77hoqiwVKlSQ7t27h/UdEnzyk1P4T1OlKRUURVEUJZHRgsoJTqnCNk+Vmv8URVEUJZEJW1OFfxLJNTdt2iRFihQxKQwaNWoUm94pGv2nKIqiKKkmVE2ePNkk1dy6datJb0ByTaLsli9fbn6uvvpq6d+/f7b4OeUkbPSfClWKoiiKkuRCFYkyb7nlFlm5cqU8//zzx0Xl2UzmvIewRdqD+vXrx6q/OVao2n/4qOw/dFQK5kuLd5cURVEURYnEp+rVV1+V6tWryw8//OBXoAJyQw0aNEjeeecduffee0M1qYRBkfx5JG9aelVlzaquKIqiKEmsqbrzzjuDvk/9PQohlyhRQlq2bClffvllNPuX4yH7O35Vm3YfNCbASiUKxrtLiqIoiqJEGv2H0OSvVh6JO0nKeeWVVxqB6qabbnLTnBJpVnXVVCmKoihKcjuqk8H8888/l9WrV8spp5wiZ555pnn922+/NVnNMQtSAubRRx+NdX9zJBoBqCiKoigpIlQVLFhQrrvuOvM7RY0RnsqUKSOvv/66fPXVVybLOea/r7/+Otb9zZFo/T9FURRFSaGUCj/99JO88cYbsm3bNpPu/YwzzjA1+nBSv+iii6RNmzax7WkOpmRGAlDNqq4oiqIoKSBUXXbZZaYIMj5U1Ow7/fTTTYFiEoCOHz/e5LA64YQT5Kqrroptj3Mgpbzmv4Px7oqiKIqiKFkVqm6//Xa54447TDQaNZivv/56KVq0qHnv7LPPNj8kBlViV/9v+17VVCmKoihK0gpVx44dk9y5c8tDDz1kfoJRunRp7+eV6KFZ1RVFURQl8Qkp/ZApvU+fPnL06NGQjeGo3qFDh2j1TclAUyooiqIoSgoIVeSiqlq1qrRo0cIk9vQnXK1YscJEBz799NPy4YcfxqqvORZNqaAoiqIoKeJTRQmaSy+9VAYPHmwyrNeqVUvKly/vLahMNOCNN95oytQosdVU4c+GX5uiKIqiKEnqqF6vXj0ZNWqUHDlyxCQB3bRpk0mngBaLHFVK7DVVh496ZM/BI1K0QHqKBUVRFEVRklCo8n4hTx6jqeJHyR4K5kuTgnnTZP/hoyYCUIUqRVEURUk8NEwv2SIA1VldURRFURISFaqSLKu6lqpRFEVRlMREhaok86vaqkKVoiiKoiQkKlQlCVpUWVEURVESGxWqkgT1qVIURVGUxEaFqiQrqqyaKkVRFEVJTFSoSrKiyppVXVEURVESExWqkgSt/6coiqIoiY0KVUmC1v9TFEVRlCTPqL5//345/fTTZfr06ce9d/XVV8vhw4e9teioS8ffn3zySWx6m4P5T1N1ON5dURRFURQlEk1VgQIFZOPGjeb38847T0488UQ54YQT5I8//pDff/9dzjrrLJk8ebJ07drV/H/uueeGalLJQvLPHfsOydFjnnh3R1EURVGUcIUqtFC5c6d/bP369TJ79mxp37690WBRULl3796moLL9H+2VEjvzH/LUrv2qrVIURVGUpPapQsDKnz+/pKWlmb83bNggTZo0kWXLlpn/ly9fHqt+5njypuWWogXSrbWaVV1RFEVRUsRR3fpQlS1bVj7//HOpWrWq938ldmgEoKIoiqKkiFCFI/oll1wiP/30U/qXc+c2glXevHm9/+/evTtWfc3xeLOqq6ZKURRFUZIv+g8OHUp/iL/99tvmdyL8GjVqJLt27ZK6desazVWdOnXk2LFjUrlyZVm8eLFUrFgx1n3PcWhWdUVRFEVJcqFq2rRpsnr1apk1a5bXaR0/qv/7v/8zv+fLl0/OOOMMKVeuXGx7m8PxZlVX85+iKIqiJKf5r0qVKjJ37lwZMmSIrFy5UlasWGF+Vq1aZf5+55135KabbgrrwPPmzZPWrVtLyZIlZcCAAca0GAryX1WvXl0qVaokH3zwgff1o0ePys033yzFihWTQoUKSZ8+feTIkSPHff+ff/4x7ye9T5VqqhRFURQlOYWqoUOHynfffScFCxaUChUqmB/Me/b3Zs2aSY0aNeS1116Tl156KWR7Bw8elB49ekjLli1lxowZsmDBAhk5cmRIIezKK6+UgQMHyoQJE2TQoEHGzAhPPfWU0aKhUZsyZYqMGzdORowYcVwb//vf/0wqiOTPqq4pFRRFURQlKc1/CD2kT8CHatGiRX4/g1/V/Pnzvf5XwRg/frzs3LnTaL7QHA0ePFhuueUWufbaawN+B3+ujh07yg033GD+7tevn4wePVoef/xx2bJli4wZM0Zq1apl3uvWrZsRspzw2bVr10oyUyojAahG/ymKoihKkmqqXn/9dWNSw0F9z549JsLP94fcVa+88oq8+eabIdsjgWjbtm29pjhyXCG4hfpOp06dvH+3adNGZs6caX5/4YUXvAIVoMHCcd6ydetWY2JEMHOjRUN4dP4kClr/T1EURVGSXFMFmPieeOIJkzYBZ3U0U/hB8YNPk00I6gYElZo1a3r/pi2+v337duNj5eY7+E+R4d2XiRMnGlPhV1995X3trrvukksvvVROOeWUkH178skn5dFHH5VERFMqKIqiKEoKCFWkSkAwCca+ffuM35VNDhrwoHnymMzsvjUG+X4gocr3O/bzTvbu3Ws0ag8//LDJmwXk1Prtt9+Mo70b7r//fiOEOYW5RElqaqP/1FFdURRFUZLU/Iew4kvnzp0z/Y2/EsWVcWoPRalSpWTz5s2ZXsOESGoGt9/x93n8rKpVqyZ33323+fvAgQPGOf2NN94wdQrdgOCGFsz5kyiUzhCqdh88IoeOHIt3dxRFURRFCVeowpfpnHPOMaY1C+kUrK/TbbfdJg0bNjSJQNEUhYJUClOnTvX+TXoGfJkQnNx+B0d0tGeWYcOGyffff29SLdhcWtOnTzf1CC+++GJT7Jkf4P/JkydLslGsQF7JnaEE3KHO6oqiKIqSfELVL7/8Ykx/9913n3EQJwLw33//NSa2q6++2pjibr31VmM6c5MHqn379sasZtMeEP2H5gu/qh07dhgfLV969uwpY8eONWY8nOXRiHXt2tW8h7CHyW7UqFFGI8X7pE446aSTTG6qv//+2/sD/N+qVStJNnLnzvWfs7oKVYqiKIqSfD5V+EhdddVV5mfSpEkm+Sb5qRBOihQp4tUUoc0iT1QgvyjvQfPkMZF4l19+uYnKQ7NEu8B30ULhGO+kadOmcvvttxthCCGO6L6+ffua9xCw0HR16dLF+/kOHTqYNsmf5Yu/15IF/Kq27j2kzuqKoiiKkmDk8oRIZb5u3TrjqI0gA/bjpFdw+jTxOoJN9+7dM0XeBYPcV6RFIL1C6dKlXX2H1Av0CaEpmA9WtECjVrx4cZNXKxH8qy55far8sXKbvHpFC+neROsrKoqiKEqiPL9DaqrwW8Ic54zoQ4CqXbu2Ma05IR8UzuFuQduFEBYODRo0MD85lZIZCUDV/KcoiqIoSWj+Q4Cymiq0UTh///777ybKjshA6xhO5Nw111yTyYFciS5a/09RFEVRkthRHUHqiy++kM8++8xbhobaf59//rmcfPLJxiGcn9WrV8uDDz4Y6z7naDSruqIoiqIkqaYK3ynMf6RLACL0yGxetGhREwHYu3dv72exWTrTHijRR7OqK4qiKEqSClUIUS+++KIRrihRg9kPzRVmP8rKOLngggvMjxJ7TZUWVVYURVGUJDP/4S+FmQ/BChCuyFKOn1W9evVMeoUrrrjCmAfDcVJXIqNUEdVUKYqiKEpSClWkL9i0aZO39Mstt9xiSsGQ5LN8+fIyf/58U56GvFPlypWTO++8Mzv6nWMpZTVVKlQpiqIoSkLhKqXCd999543wo+TL+eef732fZJ1kVeeHqMBt27bFtsc5HK9PlZr/FEVRFCX5UiqQKsFCyoRAYBLkR4ltRnU4cPiY7D90VArmS4t3lxRFURRFcZtSQUkcCudLk3xp6ZdNtVWKoiiKkmSaqj59+ph6ffwQDUh2dZthnezq/JB24ciRI+bnrbfeinW/cyyMO1nVN+46aPyqKpcoGO8uKYqiKIriVlP1zjvvmMi+PXv2mBo6O3bskNdff92kVOB3XuO9UaNGGeFKiS2aAFRRFEVRkrCgMpCfilQKTsqWLSubN28O+Vqyk2gFleGKt6bJlOVb5cVLm8n5zbUkkKIoiqIkwvPblabKWUw53NeU2Dmrq6ZKURRFURIHdVRPQkrbosrqqK4oiqIoCYMKVUmI+lQpiqIoSuKhQlUSJwBVTZWiKIqiJA4qVCUh6lOlKIqiKEmap4rcU7Vq1cr0GuVoAr32zz//RLeXSoD6f5kjMhVFURRFSXChaty4cSbppzPxp/2xyT+PHTtmclRpnqrYQ/JP0IzqiqIoipJkQlWPHj1i3xMlfJ+qvYeMQKupLBRFURQl/qhPVRJH/x055pHdB4/EuzuKoiiKokRDqCJjKSVqlOyjQN40KZQvzfy+bY+aABVFURQlqYSqTz/9VGrWrGlSvl977bVGmLr44oulZMmS5uecc86RrVu3xra3yvG5qtSvSlEURVGSR6iiaPI111wjjzzyiEyePNn48NSvX9/U+Vu+fLmsXLlSypQpI7fcckvse6wYShf5z69KURRFUZQkcVRfsmSJSZXQu3dv8/cbb7whFStWlBdeeEFq1KhhXnv88celUaNGse2t4kWzqiuKoihKEmqq6tWrJ6tXr5b58+ebv/PmzSs///yzNG/e3PuZ7777TqpUqRK7niqZ0KzqiqIoipKEQhV+VG+++aZ07NhRPvjgA/NakyZNvO/fc8890r9/f3nppZdi11MlgKZKE4AqiqIoSlI5quOUvmzZMmnXrt1x7+GkvmjRIjnjjDOi3T8lAKUyEoCqT1Xi8fz3i2XID0tMDjEldVi8Ybdc8sZU+W7ehnh3RVGUZPapshQrVsz8+NK+ffto9kkJp/6fmv8SijXb9snLPy8zv+fNnUtuPaNOvLukRIEDh49KvzF/ydJNe2TDzgNyZoPykju3Jt1VQnPk6DHp+fpUOXrsmHze91TJm6bpIVMZvbpJX/9PhapEYv76Xd7fn/9hiWo1UoTnJiw2AhWs3rZP/li5Ld5dUpKEycu2yOw1O2Teul2ywLE+KKmJClXJrqlSoSqhWPBv+qJpk7Pe9dHfsmiDLqTJzNTlW2X47yvM7/UrpmvqP5qxJs69UpKFL2at8/4+c9X2uPZFiT0qVCV59J+a/xKLhRlC1V1d6sqpJ5SWfYeOyg2jZqjwm6TsPnBY+n88W3CPu7RVVXnigvS0Md/O/de8pyjB2HvwiEyYv9H798zVKlSlOipUJblQtXP/YWOzVxJLqGpUubi8cnkLqV66kKzdvl/6vj9TDut1Sjoe/WqBrNuxX6qWKigDezSQ5lVLSO2yheXA4WPyzZx/4909JcH5fsEG2X/4qOTL8KP6SzVVKY8KVUlKiYLp0X/soBGslPjDdUCAsmYiTLRvXd1KCudLk2n/bJP/+2pBvLuohMGE+Rvkk5lrJVcukecvbiZF8ucx1SQuaVXVvK8mQCUUn89ab/6/9tQakid3Lvl35wEjpCupiwpVSUqetNxSPEOw0gSgicGiDC1V5RIFvdembvmi8tJlzc2DefS0VfLetFVx7qXihs27D8r9n801v9/Yvpa0qVnK+94FLSpLWu5c8tfqHbJs0+449lJJZDbtPiCTl242v1/Wppo0rJTuj6d+ValN3ISqefPmSevWrU0x5gEDBrjK6fPJJ59I9erVpVKlSt4kpHD06FG5+eabTbqHQoUKSZ8+feTIkSMh30sZvypNAJpQTurWmdnSuUF56X9mPfP7I1/Ol2n/aOHxRIa16P7P5hg/uBMrFDX+cU7KFS0gHeuVM79/PGNtnHqpJDpfzf5XjnlEmlUtITXLFJYW1Uua19UEmNrERag6ePCg9OjRQ1q2bCkzZsyQBQsWyMiRI0MKYVdeeaUMHDhQJkyYIIMGDZLFixeb95566imZNWuWTJs2TaZMmSLjxo2TESNGhHwv2SlZKF0bok7QieVP1SBjR+qk7+m1pUfTSnLkmEdufm+myWelJCYISj8u3CR503LJkEuaSf486ZGcTi5plV6S69O/1qmvnBI06u+C5pXN/y0zhCrVVKU2cRGqxo8fLzt37pQhQ4ZI7dq1ZfDgwTJ8+PCg33n77bdNmZwbbrhBGjduLP369ZPRo0eb97Zs2SJjxoyRBg0aSLNmzaRbt25GkAr1XrKj9f8Si4X/ppuCGlQsetx7+OI807OJNK5cXLbvOyx93p1hIoOUxAJh99Gv0muc3tWlnl8BGTqeWE7KFMknW/YclEmL0008imLBLDx33U7jR3VOk4qZhCo02nrvpy5xEapmz54tbdu2NeY4W0cQbVWo73Tq1Mn7d5s2bWTmzJnm9xdeeEFq1arlfQ8NVp06dUK+F0iLtmvXrkw/iV//T4WqeEME5uKNVqgq7vczBfOlyZtXt5QyRfLLog27TQ6rY9gHlITg6DGP3P3RbNl76Ki0rlHS+FIFgqzYF7ZI11apw7riyxcZDuod6paV0kXym98rFi9o/C2ZZ7PX7ohzD5WUEqoQVGrWrJlpF5+Wlibbt293/R18pNavT5+4TiZOnGhMhb169QrrPcuTTz5pCkjbn6pV0yN9ElpTpUJV3Plny145dOSYiRCrUrJgwM+xsL5xVUsTYk3+mpd+Wpqt/VQCM3zyPyZTOtGaRPvhjB6Mi1umC1U/L9pknJIVBdgoffF3uunv/AzTn0X9qlKfuAhVefLkkfz506V3S4ECBWTfvn2uv+Pv83v37jWO6A8//LCULVvW9XtO7r//fmOatD9r1iTuLlSzqicOtvwEjs2hasJhBrBJJBGqSCSpxBey3j83YYn5feA5DaRa6XQtejDqlC8qzauVMJoHZ9ZsJWdDgk9Sq7DB6ly/fKb3WlYrkf4ZFapSlrgIVaVKlZLNmzP7IezevVvy5cvn+jv+Po+fVbVq1eTuu+8+7vvB3nOC4GYLRwcqIJ1o9f80q3piO6n74+JWVeX609I1r5ic5q/fGdP+KYE5eOSo3PnhbDl09JiccWI5ubS1e+30fzmr1rqKYFZSn88zBOyzGlUwJn8nLauX8gpVavpPTeIiVJFKYerUqd6/V6xYYXyZEJzcfgdn88qV/1OtDhs2TL7//nuTaiF37synFey9ZEbNf4mfTiEY93c7UdrVKWMyLt/47kzj9KxkPy/+uNQIxUTTPtmzsXFHcAtOyAXy5pZlm/bIrDXqJ5PTQUC3mfZt1J+TEysWlYJ502TXgSOyfHN6gW4ltYiLhNG+fXvjI2VTGxD917lzZ+NXtWPHDpNbypeePXvK2LFjZe7cubJnzx4ZOnSodO3a1esrddddd8moUaOkcOHC5v39+/eHfC/Z8Zr/VFOVOJqqMIQqErhSyoYcNmRZJtUCfllK9jFj5TZ545fl5vcnL2xsclCFQ9ECeeXsRunRXZqzSiESlMoK5Yvll7a1SvsNcCBvFagJMDWJm08VKRIwyZUpU8bkjnr66afNeyQDRXDypWnTpnL77bdLq1atjIYKAaxv377mPQQsNF1dunSRokWLmh9SJ4R6L3U0VZr8M57gpLxlzyHBlapehePTKQSjeKG8ppRN0fx55M+V2+XhL+epGSmbIKz9ro9mmwSNF7aoLGdlCEfhgikXvpq9XvYfOn5DqOQcPv8r3fR3XrP0rPv+0HxVqU2eeB343HPPleXLl5u0CKRXKF06XaoP9kB54oknTALQdevWSYcOHbw+VZ9//nnA7wR7L9mxPlV7Dh4xamd/SQqV7HNSR+NUIG/41+CEckVk6BXN5bqRf8oHf6wxJsSrT64Rg54qTh7/ZqGs3rbPhLk/cm7DiNs5qWYpqVaqkGlr/Lx/vakWlJzFzn2HTSQonN/seNOfRYWq1CauDkYVKlSQ7t27ewUqN5DEE61TMKf2nELRAnm8u6Ed+1RbFfekn5X856dyA2VP8LGCR79aIFOWbYla/5Tj+XnRRvngj9Xm92cvbiLFCqRXJ4gEoj1tegXNWZVz+XbevybYoV75olLfTwJgCxGjNg2LRm6nHqnjtZ0DYTHXUjWJ408VbCF1Q592tYxzKyH6fcf8Jau27o1SDxUn3Cv3fJLuYnDdqTXllNplstxmz5ZVTNHsaf9s0+uWw6P+yE0VLNihRKF8UqdcEfO75qtKPVSoSnJsVnWNAEyuyD9/sBDjLN20agmjebxh1AzZfUA1kNEE94KHvphrIi0xu95zVnqh66xSqURBaVcnPf/dJzPVYT2nsXb7PvljxTbz+3nNKoX8vNcEuFqFqlRDhaokRyMA48uBw0fln4zQ6IZZFKoAn6w3r2op5Yrml6Wb9sidH2opm2hCputv524wNdlevLRZRD5wgbBFlhGq0DYqOYdxf6dX92hbq5QRsENhM6urX1XqoUJVkuNNAKqaqriweMNuEz1WunA+KVs0c5WASClfrIC8eXUryZcnt/y4cJMM+SE907eSNdbv2C+DxqUXS779jDrSqHLkPnD+6NKgvJQolFf+3XlAJqtPXI7SflrTn7/cVME0VbPX7NA0KimGClVJTqkiKlQlSib1cJJGhoJcNk/3bGx+f2XiMhOur0QO2r4Bn8yW3QeOmLG9+fTaUT8G0bc26ksd1nMO89fvMslf2QS5TctRq0xh4w978Mgxr/uAkhqoUJUimir1qYq3k3r0yxld0LyK3NShlvkdgWDuWi1lEymjpq6U35dtNdnPh1zS1CRejQUXZUQB/jB/o+xQk3yOwNZ97Fy/nBQv6C6KlA2YplZITVSoShmfKnVojq+TetYi/wJxT9cTpWO9snLg8DG5cfQMk2hUCY9lm3bLU+MXmd8fPLu+1CqbHnkVCzApklWf0HrrZ6OkLvjOjcvQIgfLTRXMr0ojAFMLFaqSnFKF03dGqqmKj0nJm6OqYnT9cyzkIXvp8uZSu2xh46vzv9EzTaJXxR2Hjx4zWdMxs7SvW1Z6ta0e82Nah3U1AaY+U5Zvkc27DxpfutPrlQvruy2rpQtVM1Zt0yoKKYQKVSmSUkF9qrKftdv3m2z2+dJyS62yhWN2HBJTUsqmWIE88tfqHfLQ51rKxi2v/LxM5qzdacwyz17UJKp+b4GgRAlzAl+beevUZJvKWAf17o0rGp+qcGhSpYSJQt2466Cp/amkBipUpUr9P/XfiJvpr26FIqZQaizBZPXKFS1MfcGPZ66VYZOWq2AVgr/X7DBO/vD4+Y1MVGV2meS7NCxvftecVanLvkNHZMK8DWFF/TkpmC9NGmZEoKpfVeqgQlUKaar0IRsnJ/UK0XdS9wfmqwe7NzC/PzthsSlno/mQ/ENh47s+/NuMT4+mlcxPdnJJRpFlNBnkMlNSjx8WbJS9h45K1VIFvU7n4WJNgOpXlTqoUJUimip8Rvbr4p2UmdTD4bpTa8gDZ6fXCBw5ZaX8772ZRoBQMvP0d4tMbbXyxfLLY+dFXiw5Uk47oYxULF5Adu4/LD8u3CiJAOVz1BwZ/ai/C5oFL0sTDCuMzVChKmVQoSrJKZQvzWvL37pHTYDxylGVXbB439i+trx6RQtz3dktX/bWNFN2RUnnt6WbjcAJz17U1NRay24IMLDpFT6aEX8TIFn/uw+dLOe/+rss2ZgeXKFEDvfbr0vTE7yeF4Hpz1eoYi3Ze/BI1PqnxA8VqpIcHrJk8wb1q8o+0EDgqJ6d5j8n3ZtUlDE3nGQSCJKV+YJhv8vyjHI5OZmd+w7LgI/nmN+vPrm6MZnGCytUIeSRzT2evj9oNAmqOHLMI69PWh63vqQKX89eb0zLTasUl9pZSNFRoXgBqVyioKnKwH2sJD8qVKUAGgGY/SzK0FKxIBYv5C7hX7RpVaOUfHrzKVKtVCFZs22/XDhsireoa05l0JfzZMOuAyZj9f3d6se1L9VLFza14HB1/DRODuv4Wd7/2VxZsnGPNzEleZXWbNsXl/6kCp9n5CA7PwtaKosmAU0tVKhKATQCMLUyqYcbFfh531OkebUSRnvW6+3pObakDUk+SbiJ6e35S5qa6Kp4c3HLdId1IjbjURj73amrvGNCWg58vdCwvPnrP9nel1QBUypaJcb0nCZZD4BQv6rUQoWqVMqqvlezqme3k3qDGGVSD4fSRfLLB33aSteG5U0m71s/mCWv5cCUC78uSfdxOaV2aWmeEVUVb7o1riBF8ueR1dv2yfRs1iKi+Xj8mwXm9/u7nShtapaSvh1rexOTkrRSCZ8vMrRU7eqUiUoRdStU/bV6e1wEbyW6qFCVApTKMD9pVvXsw5tJPRud1INRIG+aDLuypVx3ak1v9NuDX8yTI0ePSU7Kbg1oYxKFQvnySI+m6UV2P565JlsdqW95/y85fNQjZzeuINeflj4vTq5V2hSUJlr4nd9XZFt/UgU2Kt6ovyiY/uDECkVNwBHFvpepX2TSo0JVStX/U6EqO0BQWZwRQRVv858TzBGDejSQh3s0ECK8x0xfLX3enZEjooooRzPtn3RN0KkJJFTBxRk5q76d+6/sPnA4W+bnrWNmGd8yyhs9c1FTb8g///c9PV1b9d7UVcZkrLgHbRJaR4SgLg3SE7xmFYp7I+iC+lUlPypUpZJPlWqqsgXyHx06ckwK50uTqiULSaJx7ak15fVeLaVA3twycfFmufTNqbJpV2oXYp6zdoeJbiMakoLGiUTzqiXkhHJFTFHsr+f8G/PjPf/DEpn6z1bz4H/jqpbG/Oikc/3yUqdcEdl98Ii8N21VzPuTimVpzmpYwWgho4U6q6cOKlSlABr9Fz8n9dzUjUlAujasYPysSLcxb90uuWDYlJTOT/T7sq3m/1Nql0m4a4J2KLuKLH8/f4Pxp4NnLmoiJ5Q73ueP8bG+Ve9MXqHJY13CRsoKxdGI+nPSQoWqlEGFqhRAo/+ylwXrEyPyLxQ4a3/W9xSTXoCCrT1fmyJTlqX7HaUakzPOK9FMf5YLmlcx5tlZq3fI0hgJtyu27JW7P5ptfse3LlhkWo8mlaRKyYKyde+hmAt6qcIvSzbLjn2HjXM6wRDRpEXVkt5ruFUT+SY1KlSlAKqpilPkX4I4qYfKlUQuq9Y1ShpH2N4j/pDP/op/hu9oJ7ectTp9h3/qCdF92EULHsSdTiznTa8QizG4+b2ZxqTXqnpJuT+jlFEwP56b2tcyv5NeAZ80JTjWQf3cppXM+EUTct3VLZ+eRPSv1ZoENJlRoSoFKF3EaqoOa0huDspRFU4gw+jrTzJZ2IkGu+uj2TL0p6Upk3KBhKecF5oXEqEmKrbIMkJtNIUYruODn8+TRRt2S5ki+eXVK1tIXhcPfRzoyxTJZ7SYX2akCVD8s+vAYfkho4ZjtKL+fFG/qtRAhaoUoERGSgWS+qGNUGLHpt0HZMueQ4LbTr3y8c9RFU7KhZcvay43dUjXTgz5YYnc++mclNBQ/L7sv1QKkRa2zQ5Or1fWCD3Mn4mLNkWt3femrzYO1JgXX7miuZQvVsD1nLguI9XCa78s1w1ZEL6bu8H4VBFw0DBGGuoWGbnVZq7K2VURkh0VqlKA/HnSvBE+2ZFW4d+d+6X70N/k9rGzZEcO8+Oy+alqlimcEBm7wwEHZUq3PHZ+IyMUUuj3upF/ZkuYf7Y4qSeoP5UF7VHPFpWjWmQZs+f/fTXf/H7vWfWkba3wzJ+92laXogXyyLJNe+T7BemaGCVw1B9aqlgJ7lZTNXvtTiPAKcmJClUpQsnCebPNr+qVn5fJ/PW7TPmLs1/6LUfVm0sWJ/VgXNW2uilZUjBvmvy2dItc/PpUIygnIzj1Wh+3aDsPx4KLM6IAJy7eZLSeWT33vhkJPrs1qiB92qVrIcOhWIG8pvA0vDZpWcqYhKMJxbCnrdjq9aeKFWzUCDpCoJq/fmfMjqPEFhWqUoRShbInV9XGXQfk44xddoViBWT9zgNy2ZtT5aUflxrzY07xp0oGJ/VgnFG/vHx008nGgRpfnAteneIVGJOJKcu3erNSY1pLdEhxQJ1G7hXr+BwJfP/2sX/LvzvTi0eTPiFSDQp5zfLnyW00JHY8lf/4cvZ6UxS7TY1SUjWGPntcv/9MgOpXlayoUJUiZFdW9bd/+8fUlyOa7Me7O8iFzSsLstQLPy6RK96alrQaj1R1Ug9G4yrFTTFm/ETIvn3JG1Pl1yWbJZlIxNI0bh3WMQFGqhka8sNik0YCbePrV7WUogXSNdWRgDB6Wev0Pg2btCzidlIVK/xGOzeVP9RZPflRoSpFyA5NFW2/P321+b1vxxOMH9eQS5vJkEuamuzNFIzFHPhjivpmHDh8VJZn1OZKtKzdkVKlZCH59H+nSNtapUxG8mtH/ikf/bkm+fJT1UkeoeqcJhVNtnv8mGatCT98nvvr1YnpCT6f6tlY6kYhYKJP+1qSJ3cu45/2dwR9SuVNFJrcfGm5pXvj9BqO2SFUzVi1XU2xSYoKVSlCdmiqRkxZKfsOHTXRL6fXLet9/cIWVeSb29pJo8rFTFqHG96dIY98Od8IIakEGcnRypGlvFwUqtMnCuTIGXVdGzm/WSVjVrrn0zny3bwNkuis3rpP1mzbb4QBTDPJAlqlszMe0B+HmXhz1da9cudHf5vfrzmlhpzXrHLUhGvb1rCJqq3y1VJ1PLGsuU9iTZMqxSVvWi7ZvPugrN2e2lr/VEWFqhTLqr5tT2yEKiLERmZUtb+l4wnH+W/gZEmSyeszQrRHTlkpFw6b4tXspJqTeiKH7kcaQfrCpc3k8jbWNJX42qrfM0x/+KEU9qlvlywmwK9m/2sSd7qBcjL/e+8vkzalRbUS8sDZ9aPap5tPr2UKcRMFGKus78kEGwyCcWKZm8pfmouGlYp7izcryYcKVSlCrEvVvDdttew6cMRUvaeYaKAH88BzGsiIa1qb/hCV1ePlyWY3ngqq7FRxUg8EgiJOyzB56ZaET7WQ6KVpgnFSzVJSvXQhY3IdPze0VpD756Ev5pk5iKZ02JUtJV+e3FF3oj+zQXlv3qqczvR/thpfw2IF8kjHjGz42YHXBLhShapkRIWqFCGWpWow4w2f/I/5/ebTTwhZsJYFaPzt7UyIO+bCAZ/MkTs+/DvhH9Juc1TVr5g8ST/DpU65IiaajGCESYsT12mdRJW2jmGilqYJJcBe3NJ9keUxf6yWT/9aa/KLvXx5c6lQ3F2Cz3Dpe/oJ5n80NGu27ZOcjM1N1b1JJbNhzC7UWT25UaEq5TRV0RdcPvxzjckCTRmQ85q5y9NCVmdKowzoWs9kemaRPuflyTJnbXI6waIpSKXIv2AP+zMzNJHfzU9cv6qFG3aZuV44X5o0rVpCkpGeLasYcxsBHiu37A34udlrdsijXy4wvw/oemJMk5wylkRSYvp667f0jVROhI3k+Ay/wuwy/fkKVYs27DKaTCW5iJtQNW/ePGndurWULFlSBgwY4Mo89Mknn0j16tWlUqVK8sEHH3hfP3r0qNx8881SrFgxKVSokPTp00eOHPlvMr766qtSvnx5qVWrlvz888+SipSKUfJPEtG9kWEKuKlDbVc1xSwIU/hffXRTW6lcoqCs2rpPer42Rd769Z+kK4mB0yjFaokCql02vfBpqnJWo3ShatKiTQkbbGBL05BBPJw5mUhULF5Q2tdJD/j4JECRZe5nEnyiOcQ097+MMkOxpO/ptb2bKRymcyI/LtxoBBrWLQpUZydsSNnAskQiUCvJRVxWo4MHD0qPHj2kZcuWMmPGDFmwYIGMHDkypBB25ZVXysCBA2XChAkyaNAgWbx4sXnvqaeeklmzZsm0adNkypQpMm7cOBkxYoR5j8/2799f3nzzTXnvvffkhhtukK1bt6as+W/n/sNyJIr13L74e51J8EmSSGuuCJeW1UvJt7e1M1mfyf78xLcLTej+lj3Js2CTQR7qlC+StA9xtzSpXFwqFi8gew8d9QovicbkJClN4zbDOkKVb/Lc9ASfs0zBYwJBnrukabYESJxcu7TRWB08ckxGZASn5NzcVJVCujvEAvWrSl7i8nQYP3687Ny5U4YMGSK1a9eWwYMHy/Dhw4N+5+2335aOHTsaoahx48bSr18/GT16tHlvy5YtMmbMGGnQoIE0a9ZMunXrZoQseO2116R3795y3nnnySmnnGL+//zzzyXVKF4wrzElwI790TEBsqi/PildS9WnXU0TmRJx/wrllWFXtpAnLmhksjf/smSzdHvpN+MQnQzkBNOfhYeIdVhOxNQKB48clT8zSiMlU9JPf3RpUN4URMch2jreW176cYkpI0ROq9d6tTAlZbIDBDerrRo9dZXsSnJfyHBBO2j9Cc+PUsqKiP2qckAE4Nrt+2RCArsaJIVQNXv2bGnbtq0x1UGTJk2MtirUdzp16uT9u02bNjJz5kzz+wsvvGBMexY0WHXq1An5vUBatF27dmX6SQbypOU2glU0E4COn/ev/LNlr2n3ipPS64NldbG+8qTq8mW/06Ru+SLGtHDVO9Pl6e8WyeEoatdiGvmXA4Qq6JphAsQMEk3NZzSYtXqH7D981GQCZx4lMzhA2we302H950UbZejP6fminrywsZxYIXvnXZf65U3QAiZvBKucxDdz1suRYx6Td69OFBKrRoItVzNr1fakc5UIBwR2irr/772Z8mkAE3iyERehCkGlZs300G37sE1LS5Pt27e7/g7+U+vXp+cQcTJx4kRjKuzVq1dY37M8+eSTUrx4ce9P1arp+WSSKat6NPyq8HGzWZuvPbWGyZ4eLepVKCrjbjlNrjipmqmp9dqk5aZESiJHGy3IQZoqIJlmyUJ5jTP4HysTq2D2746ov1TIF2ZNgD/M32g2RCQ1vWPs397i1xc0j8zsnlVt5c0Z2ipMgInqWxcLPrOmvzhpqWwtS4IwEGqXbkqdXH9O2Ej3fe8vWbJxj0mmfEoSRvEmjFCVJ08eyZ8/c0bqAgUKyL59+1x/x9/n9+7da5zUH374YSlbtqzr7zm5//77jWnS/qxZk/hJEH2zqkcjV9XExZuMdoYbm8zN0aZgvjQZfEFjYxIkDwzah7OH/ibfzPlXEg381Gx245yiqULz2bl+uglwQoKZAP8TqpLb9Gch2SNVCnBG/3DGGrn5/ZkmJ1yzqiXkoXOim+AzHHo0rWQctYn8TYZksNGAKEzWItyozm3qLtI5Vvdfs2olUja1goe8a5/PMyZvSpwN793aBG6kAnERqkqVKiWbN2fOgbN7927Jly+f6+/4+zx+VtWqVZO77747rO85QQBDm+X8STZn9a1Z1FQx4V/JMD30altdSmS0Gwso1/Ht7e2MDwGZom8Z85fc/9kckz06UViUoaXiAZMdpSoSLQpwwvyNCWOCwFwwe+3OlBKqnBnWMYUTFEGKFDYc2ZkfyRcCMm7KiDZ845d/Et5EH63AHDu3yhWLTS4wt7TMMAHOWJVYmuJoMGzScrOBQHh95Yrm0qhyehb5VCAuQhWpFKZOner9e8WKFcaXCQHI7XdwRK9c+T/17LBhw+T77783qRZy587t+nupBJmWo+FTNe2fbfLX6h0mY/P17f4zncYK6o59eGNb6WfK34h88McaOfeVycaBMbGc1FM36ac/eLCgqcSJes66dEEm3kz/Z5sJoCAaDiE3VSD/G+k6MIfbBJ+VEuD8EPbKFMlnIhC/mh3YbSIVYDNpo/6yOzeVP1pkOKv/lWKaqq9mr5dnJ6RH7j9ybkPpdGK6RjxViItQ1b59e+PrZNMeEP3XuXNn41e1Y8cOk3fKl549e8rYsWNl7ty5smfPHhk6dKh07drV60d11113yahRo6Rw4cLm/f370801F110kRG41q1bJxs3bjRRhvZ7KVtUeW/WonVezSioemmrqlKuaIFsU3f371pP3r/+JGNfx4/guYwbL1EyqecU05+FaM/TM8pzJEoUoNOfKpVAG3xuRmJd7oNE0cIxB67LqOeJdiFRNJax4O81O2Tl1n1SMG+adA1Qiis7aV6tpNlk0qdkSj8TjBkrt8ndH882v1Mn9uqTo+9akmN9qkiRgLmuTJkyJq/U008/bd4jGSiCky9NmzaV22+/XVq1amU0TQhgffv2Ne8hYKHp6tKlixQtWtT8kFYById1xhlnmGhAHNabN28uF154oaRyAtCs+FSxsGDnzpM7l1f1n52Qd+j1q1p6zU57EyCjcE5zUndi6zwS8pwI9Ru9QlXtxBA6osnj5zcy5Z1sqZhEAReAovnzyLJNe+SHhRslVbFaqjMblk+IAt1EXdctVzRltFUrt+yVPu/OMAmlSSUS7YLgiULcshiee+65snz5cqNdWrhwockxBSzc5JryxxNPPGHMd2RWJ8lnwYLp6nHyTvE958+kSZPMe0QHkc/ql19+kW+//Va+/PLLlIgYilX9P6ulOq9ZZWOWiwfNq5aQGqULmbD5HxbEdxEnncDijbtTupByME6vV9aYpVZs2Rv3KKRNuw6YPnD7kqAy1UArlIiCO/mxrjq5uldblQjCdbTBX+yrjCCZ8xPA9OdrAkx2Z/Xtew+ZhM9EEzepUlxeuqyZqbiRisQ1NXSFChWke/fuUrq0+wUS4QuNVDBnc3/gW3X66aenrECVuf5fZEIVtaYQYhgiG04dD7hGdmGzRU3jBXm62FnhW1Q1TkJmPClaIK+cVqdMQkQB/r48XUvVuHLxmAZPKMeDCZCkvZRNmbo89SpS/LZ0s9mM4pfaLkFMr6lSXPngkaNy0+iZZmOGH+TbvVtJoXzx1wTGitSut5HD+M+nKjKhinxRQDmZE8rFN6mizRHDYhfP+mPWSf3EisXiUq4ikUyA8S6wPHlpRmmaFDT9JTokWr2sdVWvtirV+OjPtd40Evh3JppQRaAIwkmy4fF45N5P5phcd5iQR1zbOtv8dONF4sweJWrJPyOJ/sPebaN7EsGno0aZwiZPD36x8Yw6sv5UOc1J3ckZ9cuZiDRC/eOVoJXFeUqGpirZS9MkK33a1zK+lvhcplKh31mrt5sNAxr6SzMEx0QBNwi0Z2jLbf3RZOKFH5fKF3+vN/PmtV4tpW6cMtRnJypUpaCmikK44WZAfuPX5UaA6VivbMLkDLFhzTZ3TDxYkLGQJaKvS3ZRukh+aVMzPd1JvGp0YYb9d+cBk+ajVY303buSveBjaSMUh01K971MdhDWH/9mofm9Z4sqCXef4wrh9atKsuLKn85cK0N/Wmp+p+ardSNIdVSoSiHITM6OIFy/qn937pdPMuou3dIx/loqyzlNKhpnxjlrd5rIo7imU8iBTupObIh5vIQqG/XXqnrJLBX2VrLGzR1qeyNzl21KvzeSmW/nbjD+SqRR6H9mPUlEktGvauryrXLfZ3PM7xTnvrR1NckpqFCVQrCricSv6s1fyZbskZNqlpJWNQInYI2HhqRD3fRyQ+PioK3atPuAyQ+DnFovB6it3QhVM1Ztj4uPW6qVpklWKDDctWF6ssbXJv0jyQza/Ke+S9dSkT6mQvECiS1Urd6eFJGXyzbtlptGzzDPFDbGiSqsxgoVqlLWr8pdAtCtew7KB3+sTjgtlcUZBZjdC4rVUuHfRa3CnAzZvZtWKW4yfmd3mgsyqE/JiDhToSr+WJ9LNjqJUvUgEkZNWSlrtu2X8sXyy43tsz8nn1uIds2blstsZmwN0kRly56DJnUCtSsRBp+7uGmOC/BRoSrFKJmRAHSbS/PfO6YC/TGTO6RdAtq8u9Qvb9IZsJhkt/rbRv7lZCd1J2fGKQpw7rqdpi5k0QJ5zANGiS9Nq5YwGe2PHPPIW78mp7aKzaStbzqg64kJHeKPudv6uSZyHUA0f33enWEE1eqlC8mbV7XMkaZ6FapSNVeVC/MfxWnfnbLKu/tMxBxeaIjOalQxLjmr1Endf4Hlqcu3yM79WSuFFInp75TapVM2YWCyaqvG/rkmKUuovPjjUtl98Ig0qlxMLkygZJ+hiisnql8V5Yvu+uhvmbV6h8kE/841rY37Rk5EhaocnFV99NRVZmGpW76InNkgcYta2ijAr+f8a0KLswvVVGWmdtkiUqdcEeMrMXHRpmw7rvpTJR4IuGisDh45JiN+XyHJxNKNu2VMhsvDg2c3SArz1H/O6omZyuLpCYuM03/etFxGQ8VakVNRoSqHZlXfd+iIDJ+8wrvrTOSFhZIkFFlGOzJp8aZsU2Uv35wecZjTI//8OaxnV4FlrgPO8aBCVeKAVpuoLniXzdmB7NNcZpXB3y40fnpsJJOl3JEVqhZv2JVwYz1m+mp545d0M/AzFzWRk2olx5jGChWqcqimauwfa8xnqpUqZCI0EhlMPudl5MfJrpxVSzbuNnm7EFIR6JTMJsBflmyW/Ydin+F5xsrtRjtZsXgBqVWmcMyPp4Tn74jmEn+396ala34SnV+XbJaJizcbjcr9SVTQt1yxAlK1VEGzJs1es1MSBdaBgePmmd/v7FxXLmheRXI6KlTlQE0V5Q5IowD/61A7ocoyhIoC/HHhpmzx53Ga/hLR1yxeNKxUzNTvotj1r0s3x/x4ZO+2pWn0OiQWaLdZP2D45H/CTjgcj+Loj3+zwPx+9ck1pGaSCenWrypRnNVZI295/y+j9buwRWW57YzEix6PB4n/NFXC4r88VYEFj8//Wicbdh0wocQ9Wya+k6YVbvD9Qmvx3bz0avLZ46Ses/NT+YJg400Emg0mQOtPdVqdnG1SSFTIsI6QvWXPIfl4xhpJZD6asVaWbNwjJQrllds61ZFkI5GSgG7cdUCuG/mn7Dl4RNrWKiVPXdhENz0ZqFCVonmqtu09GHC39tov6QVR+7SrJfnzJEfIKzesM2dVduWo0si/wCbAHxdulMNHYxc4sGPfIZm3Pt3UcaoWUU5I8qblNokz4Y1f/zHrSyKCH9KQHxab328/o44UL5SeeiaZsOVq/l69w2iH4sXeg0fk+lF/mrJRtcoWljd6tTLlo5R0dCRSjFJF/kv+6S9Z5jdz/5VVW/dJyUJ55YqTkqt0wHnN0oWqaf9sk3U7YpcEj3Hzmv/USd3vjpkiryT4m/ZPelLOWJW6YArjt4NPiZKYXNKqqpQpks/kkvtqTvyKnwfjtUnLjTYNv7xebatLMnJihWImZx8R20vjVCIIYe72sbNk3rpdZg0YeU2bpBRQY4kKVSmqqTp09JgprOybS2TYxHQt1XWn1kzohHf+wMxAKR348u/YLd48HFi48qXlztGhwcECB87MKFUSy1qA1p9Ko/4SGxI8XntqTfP7cxOWmMSaiQRZ39/OiHTGOR3tWrLed82tX1Wciis/9vUC49eaP09ueat3K6lWulBc+pHIJOfsUoImyyyQN7ffBKCYaxZv3C1F8ueRq0+pIcmIzVn1+ay1MStbsyBDS1WnfJGkXYCzr8DyRiOsxwItTZM8XH1ydRNJjAb5hndnJJTT+jPfLTa+mCfXKi2d65eTZMaaAP+Kg18V+chGTllpfh9ySTNpkSHgKZnRJ0ZK+1X9J1QhgLw6KV1LddXJ1U3W22SkW+OKRoOEw6n1e4o2mkk9NETjFc2fx9Qjm7Um+gs8D+cVW/aa3flJtRKnyLfin6IF8srIa1sbJ3Cyat/54d8xE7bD4a/V2+XL2esFH+oHu9dPemdqZ3Hl7IR6n//3dXrk5H3dTpTuCZ6GJ56oUJXKEYCOtAq/L9sqs9fsMGrb609LV9UnIwiDZ2TsNmOVs8r6U6lQFRgcUztlXAe0VbGK+qOIc7ECybkByGnUKltE3ryqldn0jJ+3QZ4cvzCu/WEj+XiGIHBRiyre+nnJTPNqJYyAiF8sG5rsgGjD2z6YZfwbL29TTW5K4OLTiYAKVTmk/t+rE9OLh3JTlEnymkw2CnDc3+tiEgVjzX9aniY4Zzmyq0fbFKulaZKTNjVLybMXNzG/v/XbCnl3arq5KB4QlPPX6h1SMG+a9O9aT1IBNhj1yhfNttQKaPmueGuayUvXrk4Z+b/zGia9ti/WqFCVA7Kqc/NN/Wer5MmdS25MgV3G6fXKGo3Vxl0Hox59RpFpHNVBhargdKhX1mg+V2/bF1VTLAIamlVQoSr5IEp3QIYQ88iX8+WnhdHXZIYCn66nxi8yv5OgtHwKRY96/apiaALkHnzxxyVGQ0V9xzNOLCev92qpPqYu0BHKAVnVrZaKrLeVShSUZIfcWtamH+2cVYsyhINKxQtoqHAIiB5tX7ds1KMA8Zfbsueg0TBg7lCSD+oCXta6qimr0m/MLJm7NntLq+BQzeaoQrEC0qd98ro7BMusHitNFQLpbWP/lhd/XGr+7tOuprx5dSspnD+5osXjhQpVKa2pOizz1++UnxdtEuol33x66pQRsFGAmJ6iWYNuQUaySc1PFZ4JMJpClU2l0LpmqaRJTqtkBhPRY+c3MkI3pqPrRv1pUhtkBwjkr/6cvpFEY5ZsqWPcOqsjqFJyLJps2n1ALntzmnw1e72xbDzds7E82L2BCRhR3KFCVQonACWr+rCMiL/uTSolXa2rULu1KiULmjIJpIqIFppJPTwIGmDBXbRht6zcsje6pWlO0NI0yQymolevaC4nVihqnKopa5IddTsxW5FnrnHl4t7NVypRvXQhk2yVXITz1u2MatTz+a/8Ln+v2WGiOEdff5Jc2jq5EkQnAipUpXBKBbLefjv3X686PtWKuZ6fkWH9iyiaANVJPTxKFMpn8v9ES1tF2ZvpGX5y6k+VGqkWRlzb2tQZxax783szTc6oWLFk424ZM321+f2h7vXNOpGKWsAWUTYBkjLhotenyHpKz5QpLJ/3PVVOrq2bmkhQoSoFKVk4rzfXD0FZJLxLRc3L+c0rmf9/WbI5U06uSKFuGclRIRXHK1Z0zciu/l0UhCrSflAJAL/A+hX0GqQCFYsXlHeuaW1KrJDQ9f7P5sYsce8T3yw0flyYpU/KEPZTkWgVV+Y6vPnrcrlx9AzZd+ionHZCGSNQpZJVI7tRoSqFHdUtfTumji+VkxPKFTUq/iPHPPJNFGqOkWySXTSLP9mhFXecmeFXRdJHqtdHw5+KXXIqahlyKg0rFZdXr2xhTMWf/rVWhv6U7vMUTSYt3mQ2WHnTcpkElanMf0LVjogFVNa6ez+dI4O/XWQ231eeVM1oFTVAJ2uoUJXC5j84pXbplC4nYHNWRSMK0Jr+TqxYTB/oYUC4eouMKL3vs6itmpKRSoEds5JanF6vnDx2XiPz+ws/LpFPZ66NWttomQd/m55stPfJNaRGimtaSGRKklWc8tdsC7+4PDkMrxo+XT6asdYEMT3co4E8fn4jTZkQBXQEU9TPhcgNuCVFtVSWHk0rmkWBJH+rtu6NilBVv2J6cj0l/FqAWTEB7j14xJt759TaKlSlIlecVE1uzvDvvO+zOTJlebpmMqt8OGON8dnCwfrWTnUkJxSxblQ53Tw+Y9W2sL67bNMeOX/Y7zJ9xTZTB3b4Na1NQWxN6hkdVKhK0RIiT/VsIgPPaWA0ValMuaIFvA7NX8xaH5Wafw0qJn85i3gJVdP+2SY7HOWRwuGPFduMKbdqqYJSrbSaX1OVAWfWk3OaVJTDRz1y0+iZsjTDjzFSdh84LEO+X2J+v+OMOjnGfBWJX9XkpVvkgmG/mzI3RE9/1vcU6VgvuYtMJxoqVKUoF7WsYmr85YTdhw2bphZgVhxg/0unoJqqcMHcQug8ZYN+XLgpa6VpVEuV0mBaf+7iptKqeknZfeCIXDPiT5MfKVJIG7N17yETtXZl2+qSUwhXqBo9bZX0HvGHGXPGftwtp0rdjJI3SvRQoUpJCS0J2bdxNJ8dYeZmFnX8E5BB61XQhSZLJsB5G7LkpK6pFCRHmK/I0k2UGVHKN4wi+uxI2O2s2bZPhk9eYX5/4Oz6OconyJarIWIZbV0wfzPKBQ38Yp7Z9FBZ4/0+J0npJK8Bm6jknBmopCyUTzgzI6w/0pxVVkvFIp9qGZizi7MapQtVvy3dbPyjwgGBlgSikOoma+W/KOUR17Q2/89Zu1Nu++DvsAukPzNhsYliY86QiDYngesDUcoo54m8DVTL9LpRM0zZHpth/vmLm2qlghiiQpWSUlGAlFcggWS4LPQ6qWtupEjB/MciTwFWQtvDgfxFdvx1B52zzMZvXd3K+IFSGeGxrxe4/i5mL+53tMsPdq+fI1wdwjEBrt66T3oOmyK/LtlsNPmv92phApdy4jhlJypUKSlBuxPKSOnC+YxvBc6YkQpVmkk9clisrbYq3Ozqv2dcMy1NIzlSMHjx0mbmdzQq1pwXDHwnH/8mXQC7uGUVkwcrJ2JNgDZq1vLnym0mwm/ppj0mm/3H/ztZzmqUXoReSVGhat68edK6dWspWbKkDBgwwJWD8SeffCLVq1eXSpUqyQcffOD3/Y4dO2Z6bf/+/XLxxRdLsWLFpGzZstK/f385dix2ZRKU+JAnLbf0aFop4pxV/0X+qVAVDb+qnxducl3slXtf/alyNmc3rigPnJ2esBNhKZRf3tdz/jUmr0L50qT/mfUkp0INVGAsrOmU/F9XvjXdVJkgOfKX/U4zea2UFBaqDh48KD169JCWLVvKjBkzZMGCBTJy5MiQQtiVV14pAwcOlAkTJsigQYNk8eLF3vd5rXfv3scJZ88++6zkzZtXFi5cKN9++618+umnIY+lJHcU4PcLNphCy245cPio/JNRDFjNf1mjedUSUq5oflPQ1pr0QrF62z7jrEwm7DY1S8W8j0pi0qddLenVtprxEbrjw1kyy0f74rxfnxq/yPx+c4faUq5YAcmpEFRDrinWO7TtT3+3SO7+eLYptnx24wry0U0nm+S8SooLVePHj5edO3fKkCFDpHbt2jJ48GAZPnx40O+8/fbbRgt1ww03SOPGjaVfv34yevRo896yZcvM37fccstx3/vjjz+kV69eUrlyZaMZ69y5s/m8kno0qVLchFUfOHxMJoQRgUYRVnZ5OMyiKleyFi5vgwbcZle3Wqrm1UpqkEAONx8/0qOhdKxX1tzDRATiF+TLiN9XGiG8YvECckO7WpKToexP84xqBje+O0Nem7Tc/H5rpxPklctbSMF86pCeI4Sq2bNnS9u2baVQofQEf02aNDHaqlDf6dSpk/fvNm3ayMyZM83vpUuXlj///FMaNGhw3PcaNmxoBLIdO3bI/Pnz5ZtvvpEuXboE1aLt2rUr04+SPIvy+Y6cVeE7qRdVJ84ocFbDdN+N7+dvdBXNpaVpFKcZ/5UrWkjDSsWMf+Q1I//IlEyWKNFXJ6Zviu85q54KDfhVZZgA1+88YErXvHBpU7n7zHpaaisnCVUIKjVr1vT+zYMsLS1Ntm/f7vo7+EitX5+eQRu/rBIl0qV1X+677z6ZOnWq+UyjRo3kwgsvPM7vysmTTz4pxYsX9/5UrVo1wrNU4sH5zSp7E0m6Le7rTfpZQU1/0eCkWqWkeMG85qE4Y2XwEhrHjnnk94xSJaeqk7qSkSLlnWtaS6XiBeSfzXvlxtEzvf55L/ywxJi60Eqf1zT9Xs/ptKuTvhkpUySffHBjW7mgeZV4dylHExehKk+ePJI/f2YzS4ECBWTfvn2uvxPq8xZ8sE477TTZuHGjLFq0SKZPny4vv/xywM/ff//9xjRpf9asWeP6vJT4Q3kToolQkBBuHZaTeiUVqqIBCRhtzqAJ8zeGrLe4Y99h4xfSpIr/jZGS88AP6J1rW0vR/HlM+aJ7Ppkjizbskg/+WG3ef6h7A9XEZNCqRikT3TfhjvbeFAtKDhOqSpUqJZs3Z85js3v3bsmXL5/r74T6vOX99983Tu3lypWTevXqyUMPPRTUfwvBDS2Y80dJLqwJ0E0UIIENmqMq+pzV8L/UCsEie21pmpNqlspR2bCV0JxYoZi81qulKQ4/7u/1csVb081mqVujChrQ4EPrGqU0v1uCEJdVDIdxTHKWFStWGF8mBCe335k1a5ZxPg8F6RM2bfqvFtmGDRvk6FF3od5KcnJO44pmIZ6/fpdxQg/G2u37TaQavgi1yxbJtj6mOu3rljUJB3Eo5joEQlMpKME4rU4ZGXxBY/M7KQKIEL2vW3rqBUVJROIiVLVv3974SI0YMcL8TfQfUXn4VeFQ7k/o6dmzp4wdO1bmzp0re/bskaFDh0rXrl1DHqtdu3bGrwqNFd/BHHjuuefG5LyUxKBk4Xxyekbl9VBlazA/wQnlipiszkr0arudXq+s+T1QziH8ZEhSaB+eiuKPS1pXldvPqGN+v6l9baleunC8u6QoiedTRUQeaRDKlCkj48aNk6efftq8h0M5gpMvTZs2ldtvv11atWplNFQIYH379g15rNdff10qVqwot956qzzwwANyzjnnGBOgkjNyVmE2wBk6EGr6y4YCywFSK/y1aocJnS9bNL/UKadaQiUwd3apK9PuP0PuPrNuvLuiKEGJW1IYtEXLly83aRFIr0BaBAjmf/HEE0+YBKDr1q2TDh06HOdTdc0115gfJ1WqVJEvv/wyRmehJCo4SuPkivkJbchJtfxHlqmTeuzoeGI5Y65ZtmmP+UEb6M+f6tTapTWVhRKSCsU1iaWS+MTV3lGhQgXp3r27V6ByA7moyDPlxkldydnmp26NK4TMWbVww385qpToQlqFU2qXCVgLUP2pFEVJNdSJREn5KEDqhFHawpddBw7Lmm37ze9a8y+2JkBfoYqxn7N2h/ldhSpFUVIFFaqUlKVtzdKmlMXuA0dk0uL/IkAtizKSfpJksEQh1XzGgi4NyguWvTlrdxpTrGXa8q0mPJ6yQpVKFIxrHxVFUaKFClVKykJywHObVQqYs0qd1GMPTuitq5c6rhag159KtVSKoqQQKlQpKY2NApy4aHOmGmKgTurZgy2w7DQB/r48vd6flqZRFCWVUKFKSfmszCdWKCqHjh6Tb+duCOCkrkJVdvhVUW5k656DsmHnARMNiFnw5FqqqVIUJXVQoUrJMdoqZyLQI0ePyaIN6T5V6qQeW6qWKiSNKhczPlQ/LtzoNf01rlxcihfKG+/uKYqiRA0VqpSUB78qtCJ/rNwma7alF+FesWWvHDpyTArnS5NqpQrFu4spT9cGNgpwo/y+XP2pFEVJTVSoUlKeisULyskZyT+/nL0+U3maehWKarX7bOCsRulC1eSlW+TXJemF0U9ToUpRlBRDhSolR+Ws+uyvtSZrvxWq1Ek9eyCbOukT8G3bsueQqbPYsnrJeHdLURQlqqhQpeQYTUn+PLll+ea9Mn/9LlmYkaNKndSzB8rQdM3QVkHrGiVN1ntFUZRUQoUqJUdQrEBe6Vy/vDdnlU2noEJV9nFWRhQgqD+VoiipiApVSo4zAX48Y41s2XPQOK+TbkHJHppUKS41Shcy496xXrl4d0dRFCXq5Il+k4qSmHSoW1ZKFMorO/YdNn/XLF1YCuXTWyA7TYCjrz9JNu46oBpCRVFSEtVUKTkGnKPPaVLR+3d9dVKPS86qVjXSy9YoiqKkGipUKTkyESho0k9FURQlmqhQpeQoWlQrafx6oFnVEvHujqIoipJCqEOJkuP8et7u3UrmrN0pp9TWYr6KoihK9FChSslxnFCuqPlRFEVRlGii5j9FURRFUZQooEKVoiiKoihKFFChSlEURVEUJQqoUKUoiqIoihIFVKhSFEVRFEWJAipUKYqiKIqiRAEVqhRFURRFUaKAClWKoiiKoihRQIUqRVEURVGUKKBClaIoiqIoShRQoUpRFEVRFCUKqFClKIqiKIoSBVSoUhRFURRFiQJ5otFIKuPxeMz/u3btindXFEVRFEVxiX1u2+d4dqBCVQh2795t/q9atWq8u6IoiqIoSgTP8eLFi0t2kMuTnSJcEnLs2DFZv369FC1aVHLlyhVVCRpBbc2aNVKsWLGotavtx7ftZG8/mfue7O0nc9+Tvf1k7nus20/mvns8HiNQVapUSXLnzh5vJ9VUhYALUaVKlZi1zySKxUTV9uPbdrK3n8x9T/b2k7nvyd5+Mvc91u0na9+LZ5OGyqKO6oqiKIqiKFFAhSpFURRFUZQooEJVnMifP788/PDD5n9tP3vbT+a+x7r9ZO57srefzH1P9vaTue+xbj+Z+x4P1FFdURRFURQlCqimSlEURVEUJQqoUKUoiqIoihIFVKhSFEVRFEWJAipUKYqiKIqiRAEVqhRFUZSosmfPnnh3QVHiggpVOYANGzZk6fszZsyQjRs3Rq0/2d2+ky1btpjSQ9FkyZIl3hqR0SaWbSf72GRH+5bZs2fLzp07Y9b+b7/9Jps3b5ZYs2DBAjlw4EBMj/H444/LnXfeKcuXL0/YNS0Ys2bNivp9kJ3tL1u2LFsKCLNexJJVq1YlZfsqVKU4LHD9+vWTn3/+OaLvkz/khhtukOHDh8u6deui3r9Yt+/kkUcekV69epkH5NGjR6PW5pVXXilfffWV7NixIyptZkfbyT422dG+c4726dNH3n77bdm2bVvU2x80aJD07dtXHn30Ufn3338lVjBeN954o7nX9u/fH5Nj3HPPPTJu3DhTJ3XMmDHmAZ9oa1owuAbXX3+9+T9a90F2tv9///d/ctNNN8nIkSNjKrg98cQTcvfdd8uUKVNi0v7jjz8uN998s4wdOzbp2lehKoXp37+/fP3119K8eXP59ddf5aeffgp74rFwPf3002aR5EaNpuAT6/Z9F3vOn7EYPXp0VISHAQMGyI8//mgeiPPmzZNvv/02ag/3WLad7GOTHe1bePgxRx988EHZt2+fvPPOO1EVrF544QWZOHGijBo1SqpXr27uiVgIVghUP/zwg9x2222yadOmmAhWjP/27dvl999/N+eFJuP999+PqmCV1TUtGM8884x899138uKLL8rBgwejLvjEun2Ef+6Da665xmgJR4wYERPBimvwxRdfmPnK+E+ePDnqm4wvv/xSevbsKXPmzJEPPvggqdpXoSqF4cblgcADqESJEjJp0iTzIHLLiSeeaBawrl27SseOHY1KOZqCT926dWPavuXQoUNSqFAhs6A9+eSTUqpUqagID/Xq1ZNvvvlGrr32WmnRooVpL1oPd8Y+Vm1nx9jEuv/ZNT5Vq1Y1xznvvPOkffv2xlcomoIVDyba5xwuuugic7zHHnss6oIV9z/X+JJLLpFTTjnFmM+iKVhx73KMN998U/LlyyeFCxc2D3mErGgKVlld04JRtGhRmTBhgrnOV1xxhTGTIoxGS/CJdftpaWlmLNA4t27d2ghWzNVoClaMP0I5Au1dd90lefPmNdcjWoLVoUOHzOaFjQbn0axZM3NvR0vwiXX7oBnVUxBuoty5M8vLPAxYRLdu3Wpu6s6dO4f1fZg+fbrZ7aJVYjdUuXLliPp3+PBhczPGqn03oBFgLK666ipp2rSpWZDcwi1DH3359NNP5Y8//jDtnX322WbRDxcWWNsX53WIRtvZMTaB5k60+h/r9kMd55dffjELcpEiReS6664zQmgkOK+zk5UrVxqTxOrVq2XgwIFSsWJFifZ5cGwevvhxVahQwZijChYsGPEx7P3gPKcjR45Injx5jFCFRqZkyZLGVHvCCSfEZU0L91pwvPnz55sNBuVTEH7CuQ9CrRfRbN9f/xF+EOCmTZsmtWrVMnPV33zO6nEQsNCIcbxOnTrJaaedFnH7/sYJf8nx48fLX3/9Ze7tyy+/PEsCFQJ/rNq3qKYqxfC3+DBZeQiweJYuXdrsMgLt7rhx+L4/Wfukk06SLl26ZEmjRPsIVLt27TILIaabaLbvxN8ODYEOHnroITMW4Wpl/N34dqxQJ7dp0yZLWhMWLRYo4DqwEESr7VBjY1+LdGzs3PFHNPof6/bdHKdDhw5Gq5oVjZV9ONHGRx99ZAQQS40aNeSyyy6TatWqZVljFUgw5NjcZ9x/0dBYWYEKX57PP//cvIZAxXkhTGVVY5XVNc3NtUB74TQlcryGDRuajQX3Y6QaJed64bznotU+0H+7rgHjjqCGBaBt27byzz//ZFljZceJvtqADc6tXLlyRmDjeFnRWB07dszvRhXtXrdu3bza6Eg1SvQfgYrnDqb8aLfvRIWqFMI+DFggkL4xrXETMFndLEJMbG4cpPf77rvPRPBwozijq7Ii+Ngbk4nNJCYK5tVXXzWv2wUlWoKV71h88skn5nUEOvsQi0R4YCxZwJz9suMbrYc7fkJXX321+Z2FwC6Y0RQcGJu9e/ca/xfna5EKVnbuICg8//zzRtu1YsWKTIt9Vvof6/b9HYcHHQIBu30r6GZVsHLeAwhQ7JARQOyxoyVY2fnPNX7ttdfMfcYGxs5T3kOzEy3BirFYunSpcZS260o0BKusrmlurwXaHDTlFtqOhuBDP/kua6jz/oq24HbGGWfIs88+6x132omWYGXHCWGqZs2aRlNrz41jly1bNsuCVe6Ma0wkODj7mVXBx3md8cXDzWHYsGHmPfofbcFKhaoUwgpE2Imfeuop46OBYyoLGzcAEzXYImQXYW50JheRHTj1EV0FVhiJRPCxDysmdqNGjYzNHx+PNWvWmNf5sTdSNAQr5000ePBg43tz1llnZVp0whUe6A8/ONazgDkfdtEUrPCree+99+Tee+/1CoKxEKxYZLm+zmvr1FKGMzZ8jwdrgwYNjBMrkXIXX3yxEZwhq/2Pdfu+x6lfv755OKBJeuCBB8xcdY5TpIKVnZeNGzc23+c+dR7b4hSsInFet2sBx0F7hHM0Ag8PV6f2J1qCVfHixc24kxoFQZBxs/ca2lYrWOG8jnnTrWCV1TXNzbVo0qSJ8TPjOlus1iQagg9O+5g+mSuxEKzoK+fAeoEpzp6bP8EqXOd11gLnRph1+/zzz890bH+C1e+OzZpbWFOJyANfzWSkgo/vc4c5ytphU/jY/kdTsFKhKoVgAqHhYAHC92Pu3LlGQ4Nt3TlR7SKE3wmCk3MRYsKxoPMQYefGzfryyy97F0j7wEXw4aHATYTgEypvjH1YscifeuqpZtLyv/WLcPYvkvZ9oZ+cox0LbP+Mx2effWbed/oGIDwwFvSJGyrQosMNyA+LE599/fXXjbYkkGDFDbpw4ULzcOemDtZXJzzk2Dl///33ZrG1gpXTFOi27WCwEFotJNcWHw9yJTkfrG7HBp577jnjvI+vDr5B+Oug8bT9j2RssrN9C/O9Tp065r7gnDkO2h47TvY4CFbt2rUzAh2Clds8Vvht0M7HH39s/ua7aJKYp06tMPch50JfEKyYw+GAMzf3G/Pozz//lEWLFhmneOe9ZgUrhAoEQ+7FUHmsnPOV3+2cqF27thFGiSZlvKxgZf1YEKxeeuklo7EiJN9NnqNorGnB2ubcub52XeB/hFCO4yv4cN04XwSfcAQTzhPTIuksEPIDCVaRtm/XywIFCpgxsIK6U7A688wzpVWrVsZXj/nm1pXaauaZR/jDkS4DmEv82M+AFazy5s1rAgjC1Vjhk0UbFtYj7mELgg/+kvg+8R4pO0LB2HJPsRnD34t1DMGQ79prbPsfSft+wVFdSV6OHTuW6e9+/fp5JkyY4P370ksv9bzxxhuet956y/Pnn38e9/2XX37Zc95553kWLVpk/h4+fLj5jmXHjh2eevXqeSZOnOj3+DNnzvQ0adLE8+mnn4bsK/0aMGBApteeffZZz/333+/3XMJt3/n9I0eOeK655ppMY3HhhRd6XnvtNc+QIUM8CxYs8Ozfvz/T95988klP586dPStXrvTb/tGjR83/jz76qOeUU07xXHnllZ6BAwd6VqxYEbAfX3zxhadFixae33777bj26KOzXf7mu7NmzfK0bNnSs3DhQk+XLl08V111ld/+BGs72NjY4+3atcsch7nBeZQpU8bToUMHz0UXXeTZvHlzWGMDjz/+uKdv377ev5ctW+Zp1qyZZ8mSJd7jux2bQO3ffPPNMWvfMnToUM/VV1/t/XvNmjWemjVreqZPn+7387///rsZx2+++cZV+9xL9Puvv/7yXHzxxZ4TTzzR07BhQ3Ot+duOvb1Oa9euNe+PHDkyrPPgmjHXnWvD7bff7hk0aJDnvffe8xw4cCDT53/66SfPySefbP4PxaFDh46bx9wHJ510kmfp0qVmTjFfXnnlFU/v3r0zfffUU0/1nH766Z69e/e6Oo+srmnBGDZsmKdNmzaeLVu2mHnPWle5cmVP165dPbfddpv3c/ZacE+yHo0bNy5k23ZcWONYK6699lrT9+3bt2dq00k47TPXbRusGcxZ/i9cuLDniSeeMK9zjZ3XijnKPc6cdcu+ffvMWsp8AsaJ+Zs3b17PLbfccty8P3jwoOe5557zXHHFFZ5//vnH9XHWrVvnKVeunOeZZ57x/N///Z+nbNmynqZNm3rOPPPM4z7L84DXZ8yY4Wrd6NOnT6brwjr10Ucfef/OSvu+qKYqybE7CQtaBsxdSPjsftkt4kuBBoodDK85YbfMDttG2lWqVMmrxaFdfmenQ+Zqf7ArLVasmLHp+2LV2HbXxW6JXC3O19idoJJGbe/PURGVdqD2g40F/SYyi5wqaBvQKrED5TwwP6Dq53/njo3dLbt0zAiB2gfaJaIJ8xNjy87PmZ3XeR5oPQgvR+PnOzZWLc0Okp0df/NdduWYUzD52KSoF154oWnDmaU6UNuhxobdG8fnGvA/48AuF7U9fnSYVkjs59RYhRobq1mx2hprlkHNzo7QjombsbHf92cWjVb7wY5TpUoV77xgLGgDbUugDMyYUElL4S/yybd9/j799NNNSD2+c4sXLzYa4ZkzZ5o5iTaS/7lWVgvTu3dvo+Vxml3cnAf9xlTK9UUzxL3P3GUOcS/ccccdmUxNaMPQMjAfg8HYYJrEN8XpKM0cIhIPTRQJfTGnsD44TX2cMy4GHJ8xc3MeXAP6FumaFqxtnOu5Ht27dzc+YVwLokjRKrFuoDUCey3+97//mWvBd3zxNdvZdZTISuYGY2Lb8KexCtW+72eZ67ZfaGLQ0HEsNLmYYFk7WaPQTllwXQA0T4Hw1WLRJhpT5s0FF1xg/sclAC0wWiDW76lTp3o/ny9fPqPx497EkT3UeViYm6x9+GzRBm4naIvov+/cHzJkiJkXaK5DtY9jOqk+7LlxXUhlYsfCX9RlsPZDErYYpiQU7FbQwCCNW8455xzPueee68mVK5fRPMHu3bs99957r6d79+7md7jjjjs8jRs39u6cLKtWrcr0N5+76667vH/PmTPHs2nTJs9XX31lpHnf7/tqQ/73v/8ZbQsaAHb9zr4DuxL65rtz/eyzz8zu3V/7gcbi1ltvNW1Zrr/+es9pp53mKVSokGfEiBHe1/lc+/btvbu4xx57zNO8eXNXx+IcDh8+bH4fPXq054ILLvCrseJ47Oh827Q7o507d3pq165tdmTsYukLuzygzUceecT8Pm3aNE+RIkWMtsTyzjvv+G071Ng88MADmV6n36VLl/buyPjcxx9/7GndurVn+fLl3uvjdmx8d6bsVrnuTu0S2k/GLVD/7dzZs2eP58svvzRaFatV3LBhg7efkbbv7zhogZgDP//8s7k+vpq66667zoyVBU0n9xF969SpU9Dz4HNoK/r37280LNw7zBW0nWje7FwCNKmM9datW73atksuucT1eYwfP97swO1r7Pq5B5g/9MGOHf3mGlttDmOIBsPtfKJN7qk333wz0+s33HCD0XSh+alSpYrR+LRq1crzySefmPf//fdfsyYEOw80I1OnTjXf4XdAw8O6Fuma5rwWaJpZL1m/GAuuORrNBx980Pt55hv3H/23Gj3OlXU11Hp39913m7a4ds5ry7HQUnIuTo2VXQ/ctO/sP/eGs320nHaN+/bbbz158uQx52VBe8Wa52Yucf5///230RDae++hhx4y1/zrr7/OdL8xX533xvXXX2+0bcHOg+vKPGGuop2z3HPPPZ6CBQtm0kCi0UWbO2XKFPP3fffd52nXrp1n27ZtAc+DZ8n7779vjmfHyKnZ4//zzz/faDt9wXISqv1gqFCVAtgF7tVXX/W+xsJ9xhlnmMXfwoOmWLFi5kaw2MXIn/nNTsCHH37YPDjgww8/9FSoUMGomcEKAf5gkUdoQF2M+hVBwd70TtU3iw9mAyuUONWxwdr3hc9iaihVqpT3AQKYrGjfqcr9/PPPPSVLlvQsXrzYexO6NUf4jhU3rxWCfIUKXxOjPW8EqqpVq3ouv/xys2gwvk5zDG2yUCFEVKtWzTzUeTg5TYG+bbsdm+eff977Og9X5g6CsoUHX/Xq1b1ms3DHxjk+N910kzlH+OCDDzx169Y15iHwNT85YdHls4wrDzbmEA/T1atXZ5ojkbbvnKMs2DyweRhjmmIDYRdUexzMZizCwIOAa2LvrWDHYdzq169vNj5sEDCJ9ezZ05wf7fiaFxCgK1WqlOkedXMPMBe413iwtm3b1nPjjTd6XnrpJe91u+yyyzKZlHigsRZMnjw505i75e233zammlq1ahlh1PlQRFikL5jPEDIQWBGS3MDnGzRo4OnYsaOnQIEC5n/7EOeahLumOeF1NibdunUzwgXX89dffzXvcQ6+1wKhjmthBflQ9xxzCdMh1xmBlWv9+uuvZ7rvuS8mTZpkhCo2BL4P7mDt+/afOeU01WKeY9PE/OdzmBwRQq3ZDtzcx1yDRo0aGRNtWlqap0ePHuY43AtsolmvnHDNmXNWeNm7d29AwdmeB/cc17J48eLm/n7xxRe9wiBzymnuZf3mvrZCFWPEWAeDecG18GdipZ+cC5tFp5nfrllu2g+GClUpgHOBs9oNYEFiAbfaFTQVfAYfDX+TzRf7GR5W3KDff/+9J3fu3J53333XVb9YUNj9Wtips+v29yCifXY39iHmz7/KDfTVLjzsGC0sYowF58QiifaMByNjESnOMeS4LA7sULkp/dnpLdywCC1O3zUe6i+88IL3b8a6RIkSRovFdbM+B24fTqHGxunbxkLJQxBBjwcrmqry5ctn2kFa3F4Xe/4s6PjE/PLLL2bujBo1ytX30R4wH+xDBgEErcSdd95pfKgsgwcPjqh9CwIm42Fh58ouFeHGKdDwOoLKjz/+aB5Ubu8B7k0espbvvvvOPKwYY+cGiAcRO3seLggVzNFw7gGEA/y6GHceGjycEA7xhaFt5uUJJ5xgNGAIJTwImVv+rnEwbJ94yCI0sLlCGEV7AgjnPDC5TpZg94IvXEu7RiDc03+uj10vrFAayZqGhgOtln2wn3322ca/zMnGjRvN/9wHbMzwMUPzGaxtOyb4r7Hm2vYRxNE8WZyCFfOV99gs2Id8KPz13467XTPwCWNtYRxh9uzZRnvpFvrGJp2NCn1i00kf+QHbT6dwhrbVCieHHZqzQKBNRPgHNkmcF+ufFV7Z2CCkcZ8zX9l04+/JubiF+cCzh++zhrBBZByc48y1RpuK0sDi5rkYChWqkphAC5ydJCye7JgQuHhQ4MBo1fDhLNg4NfIg4YcdgNvv//DDD55evXoZYQDYOdMfdliYu5zOkmh42LnMmzfPkxVYWNjV8JBBy2GFhz/++MNoedDK8FBjLHyd3yO5oZzjgNYHx/pQ0BdU6U5w6LULoW2XhYYFJ1r4jg0PVmAxQ+ODFot5xEKDAObELkbhCr2YKJg37HitIOLmu+yGK1asmMnJnPnCeCAQW80E2pdI2ncKZWhxnGAudu5ggQU5knsA7ZqvFhKhgN2/BRMd54r2gZ27daANB4Rt5rS9p5jLCDjMKTSUCGwIK8x/1ghMvnYtiARM1TgRcwyOiSM9mybWGRyXw9EwO6GvTk0qAicaZdYOQAhE84e2nGNh1nR7HpjXEHSsJou5xH3Aa2xGEaQQsurUqWMEYcbTKfyGAsEbB3nrUoDAwDizDvpizY6+Wp9I+//000+ba4xQh/M4OAWIcO4JBCqnWRfhBpPcmDFjzN9cWzasjBHayHz58mUyCYaC/jnNhQjPzH97jekr6xDWBZ4XCM2+61EouN/YRDD/ucfZQDPva9So4bVOWMsL83j9+vURb+R9UaEqBQi0wLFwozrFRswuit0Rn0UjEY7pCEGHB62N8mDyuZmA7CzYWbGTQbjigYT5jx9uKhZH69NBv5jYWYWFhBuSY3O+CHDc+NxQ8+fPN2p+xsI+rO152AWIBYsbOBxzV1Z2N/a7CJWoq/Ejs1ifpmjhb2yIgsHvgoWShZEIN2sK9B0b5g07YRYit+BDwnXHfyWcucO8RfPiNF1YgZTryQ6dPkfavlOTVLRo0UxzD80ICzk7WdsW48JuGQ1QOMdB6KN958OTByEmK+fOGw0Ywq4VysNd4Nm4cG3RrjhNF9xfaNisLx0CIUIb4xjJcaw2gvuVzQlmakCbkD9/fnPNsgKbLaLxnDA/rYkXEB5YP+ya5vY8uLcYex6yjAfzBoEWLR6v80M7zG+EKSuguh0j7h+robP+kZhC7Rhl9aEdrP8Ic2jKnQJDpGsXbTm1q4A5kI0XIHwyr7hW9MP5XHAD89F3nnCNmb+sMRbMfWwWrLnXbfv2nBDeeC6y5ts2eB6hSbVtodEKd8xCoUJVkhNogcMfgRsB7ATiAcQk4wcJ3ulHEwprJgv3ocXCxIMLLRRqZQv+U/TDrRnFDfQLAQDfI+vLwC6Wh5odi0DfAW5oNAV2p5dd2EUA0w+7TrfOwtEYGx7uLDKBcI4NggamBUy1COVuhUmbhiHcucPccApMTo0gpkEb9GB98cJt34LAj0YBJ3IWXTQ6jIvvca2/XLjHwdzBTh9BAE0CGlM2KcFSJERyHoSxsxNHQHO2g4CAFswZJBINeLijXUAgRROAORs/QWfQjFvs+fKAo69nnXWWZ+7cuUZzhbYCU7hvIIi/74eCa4wgwAbG6SrBA5wNgzX7RtI2WH8+pwDhTAOCIB2pFi9Y/1ln2ThaIdMN9t62gRpoVdHwINhjfkOQZcwJPmADjDaJAAR/uLknjmW8j0mOjT/PLDa3aIXRSmFRsVaNaMA5sX5gcrdwfqxjrCGxQlMqJDkkESQMmnQFJJkjDJ+Mw+edd54JKyYUmdBbEgcSPnzppZeakG1C+W2tq2CJ5mx4LakWnAkw3UJSQRLSnXvuuccVbSWsOJLaacH6Sngs50gfCd0mRQCZ1MuXL+9NFOmEzzmzXJ9zzjnyyiuvSHZiw6LJ+EtqCZtQNFrV64ONDdmWSSFw//33h8xGTFZmksLSP5sdOhh2XpEV3OJm7tg5R+JTStKQToLyJBayU/MZm8iSVAvhtO/LW2+9Ze4ZwsIpw0EKAjLw2zBxm3SVlBH2GOGcBxm1bYg26QreffddkzmaseQ1f9c5nPOwxyENxiWXXCJ9+vQxYelcY9ohC/n69esjqo0XDNaEoUOHmnnBesO4kZiThKjhYs+XpLdk1mbukF6A/0m/wDpi64RGMl52LpIqgfQS3AfOott8n/XTX0LScK61LRht+0gyS5uKgzQDJIydM2dOyPbC7T/3IteY+9ItNlv9iSeeaMq29OvXz6Rg4HlCqgrSfXAcUqmQ3oC0DaSZcJ6fxc09kcuRkob2SNVDln/6zr3QsmVL7z2dlTqFzoSopGhgvG16GK4TaWE4x5gRM3FNyVaQynE2ZsdoHZsxWdidy9ixYzOp1dnV4ujo6yAZDUc9f+CTgsaInRaRd/jzYC4IJwmdWzDfsevB74KxQJtHlJO/RIEWouvwoXCGtrMTxF/NRpzFcnwsmA+4hjjHxoJwxwYzKNoPp1M9mioiZyBafgi+ONslqhUNIqYtTA1oFUg8aE1x0cJ5L5BiAIfxcJysw4F7AM1IVrQWTpzzEn89zCn42aC1QvvCvReuw3IoiPBC2+wMCAnn+6GwaSXApiGIFpiE8C8k4o/xwUUC7aSNao7W9eA6o4nBNIjWJFoakmj1H608vpvWtwmNlFNT74x8RHvoTO4bDfY4TNVoxHz9G7MKFhk0nVwHNJ/8z71gIwljgQpVSUA0FjhyjnDzWBMGD1eEMCIkUCc7Q6txLsYnKxj+hItQ/cSXCoGBxQAVrNN/yO2x3DzkUFGjTraZ2t30DQdYIlxw5sZvgQceDstEomAecoZbE+7rTNkQKlO6G+xnWcS4TlyvWBDu2DAuzpB5PkuOLPwp/BFqbHyPF47DO6YgTJWYITCphfJ785dF3i08YHAwd+vXFq4QgRkC80c4JvhQOM+RhzcPQMxE/CBAO/1VfAkUgBDsvHA74EHlFrfXw98xuS+5LwLlDopks8N9TcoEHJqZU8Ec3iOZs4CTug1wsAJVpGbqrPQ/2CbOGUFoo279meFon7Ux2DxyEuwc/b3HM4g1l+CErI6Pcz5wjvibITDyjETBEEty8U/s9GBKJNhs21wap0rV928nZDRGXYuZxh9kOqYWk81MTrZdVNOYNjATYtIhMzHmD1SztIfZJRhUFSfbN5mtK1asGPBzzn7TR2tyo1aYnX6hVMeob1ETozLGZILZMxgU2qWYslswlVCvbPz48UYljhqa8cEc98Ybb5i6UJhw6AMZ1DEFUSfKF2emdMwxmFoZU7eg9qb+HuZKN58NZYLLytj4zjd7POYSqnVMhph2LcwlWzvS39g4x8f+H+ocnH3AtMG1x2SMmSgYbtsPNrfXrl0rdevW9fu+bdf2j3O3Ne6C3acWzoOM075ZvwMdxxKqbefnuYcx+1OoN9h42e8w722WdTKAY9Jz1mKLBW7GCqiEgLsABXEDXWv6T21BzoE1KRD284DZibWE86Tmm7/1yHcuBVqf/UF9PNZR1g7cEPy1H+41Drf/wSDzOnPE1nclaz0mStqlfqYT6kdybMy9/gh0r3lcXmNqqnKPB6qA4GzfTZvOceJe5j7gHsVdINxxCouYimxK2Dgz82KSYndOqC7Se1ZxmhqcCfLQiqAitYnk/NVRs9jX2NHgbIhGh12Ar1NvoO9FCpoVdmM2ND1QPpSsHAcnU6JSMG85x4qIKfI22d2bfc/3WE6nbsxr7CTD6VckfUdbQ9oINxq8aOyO7fxEW4UDrtNEE2xsnN9lfHCCJcoOLalbk0W40T/cQ+Q5IoUBTtVuo3zcOtzSPhFRRFFyn6JNiQVEWzlD1t2OQzjXm3lEEAK5k0iKSWAJGkq0UdEy8WJywVEfbQdBCNHQeDjvOe5RG6Hm9nvhzCXMeFxnou3CyW/nJpCCa2ytBW7GO6tmaecxiIp2QhSeM8IX94dQx3NmfL/vvvtMTjk0QllJohlonKx21I12MlbuCcFQR/UEA0mcXTJO0zhNokXCARRtCTvPrCgW7U7a1k2zbbHDKVOmjKnZBf7qqFl4jT7hMHnNNdfIhx9+aHaPVC9nt24dDH37mdUdAbWwNmzYYHZRaK3YnbHb99e/SMHJFMfbW2+91TtWwM6MOmq27px9z/dY7IrQeFFxvnPnzqY+lr9+BXLCjKTvXDMcn5311Zw4r0M0dmW+tcb+/vvvTI6rgcbGObeZL7x/6qmnmn6zK3b2NdAcd9t/exwcX3GyRUtDbb3vv//elROsG4db2mVOchy0w8xH6tqh2Yw2M2bMMDXX0CDb47tZB8K53jhRo23mPsYxnMAXjufrgBzp+kO9uOuuu85oP3Bwp37f/PnzXbUZ7Dyshor5yNpAjU/f7/m73v7qvQWbS2h2ubdxckajMmrUqIBtW+x7bgIcqLtJ0AjWBDfX123/A+HsB2Pn7C9O3H/99Zf5netE8MOaNWtCjpPVMs2fP9/U4+S5RcAERMsgRi3Ljh07mqAFf7UTfYmJJioU2S7GKSFBM0JIqwWHU5zMfbUzWZHC2dmhXSLJGykPSLDnJnGldYDHNm3BARZbOLs5p59LNJ188TUi5wvHJWzbHieajuPO8UQzSPgz50Q+HJy1nQ7rgcARn8zeFrJakz2Y/53avGiMDW3g0M7cIDSZNAfkIOJ6UgojmsfyB9ofEob61ooMBo6iZKl2BgTg18f1dGoustpn/FeYk86+ohmj3WjMUdKTOM+DdAVoMvDfYE46s2dnFbTCBHXgj+hMwxCpn48/mJtoKOzYMC4kwfSXoZ5rGCwdhBPbL5s124JGDL84J4xZJOfBvYUW20JuM45HgINN58H5RDpGnKvNlA6kjLB5s2xpn6y0b8efdYN1xmolw/Fviwb2+UJaF8aQvGnhVA8geKVr167e8SA1ia0Za+8H33EK95xIQEqfmJs2/YXvMyAe2iknqqlKQAiVRZPEDgnwzUEjQcVuXykcyd3umsIBLRgpFagwjkaFKt6+NvRAsPNnt4mN3faD3TRhz4S7Ww0Nuyl8kwL517iF3Qi7J7QBn376qUl7QBgwWB8fQBPx3HPPRXwc564GLQyaFKrXE/b7zDPPZArdDwQaPHZS+HVcccUV8sMPP5idKrs4wvbROEZrbGijePHiRqtJCDQ/VF6nejy+c7YyO5+bMGFClsbGid11khagS5cufsPQA0F6BVI4LF261KvZIhQc/x3SGIwcOTLT+KANjQTGnOPYcPaSJUsavwpSe9xwww1erQ/H+fLLL2XAgAFhtV+gQAGjucRnhvHgWOzSaRd/OqvRY07R/tVXXy2Rwhhxbw0cOFAeeeQR7/3u1GjwO9qm/v37h2zP3+4eH746deqY+wyNOO3xt9VQODUNaGp806OEuqfQ3laoUMEb8t++fXtZuXKl0e4xPvj1MGZ8nvuY19xy++23m+uI1rxXr15Gc4smAw0o99eCBQvM+7RNygdSNoSrwS5UqJC51lCsWDGjySFVxfnnn2/SDITTvnMs7bXAV7Rbt25GS05qA+5hX41VuP232mPbRqgULdZPtV69evLwww+bdYyxJLWJP02T72s8F2rUqGF83xgPrjljz5qI/yU+hHaceG7ZcwxnnmIxYNwvv/xy86yZPn36cRor2vz4448jei5Gg+Devkpc8F3gmIi+C5ydjCxwLOjhwg0wePBg78MBQc6t8x6fHTRokHHipX88IHHEZOFBwOHBXr16dbNw8sAnP1ZW4KYhtwk3KQ8OcqpgfsHJlz6/9957xnEaU5JVZWcVHvLTpk3zOiBzbLcOpJgQebjh9Ik5CGEMARkH9xdffNGYvzAnZHVsbH8QMFls6SOCCPOHYyHEsUBiFsH8Eq2xsWPAPCCnF6ZjtyCMswAiHDDvWFh5GCIcrl692uTgYbwQCgkOCBUsEQge4JhrHn30USPkMG+YJzy8eJizUeEzrVu3Nudz8sknh9U+jsHMfYQo+stiz0OXcbZClL0+PGiYT6HwdfS1f3OfkS8IAZPXeOBB7969vQ9e/uce4XxCQZvcP8xvTJjA97ifnPl7cFbHbAq0zwMMofiuu+4yrwW6H/y9zhzlXmL8yaWHWYn5yNpBsAs5wTgvzo97JtD18B0j2qRPBNlwrRHa/vjjDzOfOM5DDz1khGjynDE+ECw4wJ+zdbly5cy8pX3ubza3bEYxBWKuYwwZJxsMEKx930AN/ud4nAMmVwQQ5hXCJuscQqHveIYKbnAeh7nPJpS2AgUx+cJ9Z+c2m8pg5njneBF4NGbMGLN5494jaIAfrgkBSghDXAeuDW4DrFeh+m+DDxCc6RcmatwxyMXGtUewev/998367+wLzyGE37gQVz2ZEhDfkFbMF7aQKKD6dJbWiETlGcwhPRROs4nTqZuQffJfYQbzd6xIsOrdp556yqteRu1O7iJyjliThS29Ew31bzAn/VDQN3JckdfFFmgFwvNJY+Eb+pzV/pImg9xTzoLMOPRTKJkyFtEem0jbsd/BcZes/2TYx2nZN92D7XNW5ieQroDUIdw3V1xxhfd17hvyOA0bNsz8HampDjMNc5BzIKcVNQlx8Cbfjj/ctM/csbUFwdaRs99lrnNvYSZymuCcJhC35XNIa+LMwG3bsP9jmiW8HpizVGlwm7Gb+edb184ZHONcu0i1wnW394p1bg7m1O1ba44UGAT24GSPyd5Cf0nh4tuXYGPkr33yuDGXMCET/GDhejBG5DUL1b4zUIPM/dyfpLqw5Yrs+5j0cfkgcCBQaTC3zvusN6yRzM1wTJTWGdyfc739m7ElwAmzMaY/ngNffPGFMY8y5jirWwhGIbDJZjf3nddugg98P8t6gZmXc0wkU6Ca/xIM3wzmVq2J+cKaTDCBsTuyf0fqkBfMIT0U1lGS/qLJsf1k98Yu3pous9I/i919sNOhbVT79evXN1oedneo59nZBHOSDpdATvpuwDTCjpMdFrtcCxpFxsdfNuKsgKmYXTKZg9FAABoBxsMGH/B3NI6V1fnGfLGam06dOmXSjDCH2OH6ZtmP5FgcB03gZZddZkLZnYEHvMcO2B7HaaoLp3128ZjQ2S1jCiUlByY6duFoSXzNF25TB6CBsmZQxsepqUAbjDkGcwrVEkhh4TwHt8dhnDGHPvjgg15TqDNFBGDO5FrhuI6zMpnn0T67Aa0gJlUbyABo8xgTftA42LWOLN7MW8bMfi7Yefg67gNaRxzhSRGARsNC/9G62IzabsbIX/tkwmcu0Vf6zfgBwTNoYgjXD9W+1RDiZsE5oh1ES/fkk0+auWivIZocsskzp9DQoPn0dXIP1H/fKggcgzQxWDms6S0Ydm1yarV8v8PftEc6FZzrWYMxgTJPzjvvPDOnGCfndbBVPTANgr3v/fUnUPCB72dZS5ljHAstLi4bvlpGdVRXjsNK2mQex7mThJk4NDp3s/GGnSX9wUmXCvNkJg+nBpVbcAbGMZps2hTVtcQqUWakOHdH7L6pvYazMQ7v1DCLVtZm36SbODM/8cQTxlkdR+1ChQplqgOXaFCUlfEgYS11x5g/XFucwKMJu9giRYoYbS+OriS2zZcvn3HEzQr+dsFWG+k26MMXCh2jWUAT5Uyi6rsDR5vyyiuvmMSehPdHomUjsS3aXxz6Sa7qe14UoY00cSV9Z/6hIbTFy52gjaF9xon5WrNmzaC1/dw47jvvOeYWiWtxVqfOom9NvkjbJ20GGhdqHjImaEr4rNu5xLpI/U2ngzp/2/45rzMaNzRAXONwEmKiEaTvzuzkBIMQwBItOH80VBYSzaIptJByBS0T6w9BM6TE4R50JlH2hz1H1oJQwQfOWoJ8Hs0e8yrejuoqVCUJdoFDDrYLnI2WifckYlJzw6LSJscTKuBYgdBAGQ5/5grwpyKP5/iwuBMlxqJGTi8eINHGnh8LPtegXbt2JlrJmhkTYRx8sdcMIYJCsBS8xoRm5060zZSYUcg8TVZlTBNEsEXzOE4w/0UqGPLQIfIX4Q/hjHJSgQQrTE9uIlIDmXeI6kIA4cHtK1hxLEx0CF7WZBNO0VyiBpn3CMw83J0VG+xcxVTKtee6hJPlmraY3+Tv8zWDAm0xlxBWeDA7cy5Fo33WOsyVXB8y/NvKEG7mks0JaAUDoIA0Zbv8tYEJzE1Wf+f32GCRu85XyLVVFHyPwecxB4cDc4K1xpaxwSTNeV166aVG2McUiBkQtwSuL4Ltp59+GrA9XxM8Ajbf4VryTOG+JXq0R48e5tr65tbCFMhamwioUJUksMCRUoDJjD2ancvmzZu97yfKA9OZ/DEWfQqWTM7a4gkN5nPRqqsWKfb8t2/fbvpj/UhiMTa2PXZqnLdNymmPZd9n7gQq9ZHd2OvFXGZxtgkVoz0+ti1SP/Dj3OnGYo7aMPtI2ua7+BjxXYSBUIJVpNCOvT/wyfMnWIH1cwp3rHhQI7iyGaSWnD/BiuvAPeGreQgF8+X111839zkPczQUvoIPiV4RRmzC13D67qb9ZcuWmXGzZb/cjg/n+/DDD5v71KYwQKAiqahvP932OVhZLPsaGkESEvtaEBDMSWbq60MWCs4bDTy+mgg0JMDFenDVVVeZcl828TEWFpK+zps3z3tOgZImo5lDG4V/HCDo4fvIJsjWQmX80IghsHPcRESFqiSBicgCx86FmmHswpDc3eaLiTXxFup8nUC56XCEZnHPSQTSSvE3izi7PuqR+eYFitf1i/e8SSR8Na84e8dSsHKCZgDBirXFbU3OUCYoGxyB+dWfYBXJefhqNNw47idS++C7qUH4RHiwQi5rVigzmb91D1MrQRMErPjbOHB9cR73rZkZKjAgEM52nJUVfvrpJ6O18tUm+cPXKZ0128ImixqjboMPEgV1VE8CrPMoDozkDsH5ktxJOE+SiwWnSev0GSrDbKyIi0OgAxwUcUYltxQOjOR6YSxIMQDxHp/sIlDwAX+Th4acUjbrN2NmHWzt57O7FGi8500iYZ1s7f8EF5AHidQnOKTzv/P9aMKaQhoI7h9ysuFUnJW5QPAE6VqAcHfa5r7Emf+XX36J+Dx8gwrcOO4nUvs26Ajs+OLQjcM6wRRktCewgr/d9pegoGbNmhkneNIIsOaRD88GrTgDDyZNmmSuLdiKFKECAwLB2GQoZky6Cns+nTp1Mv2ihmkocErH0R+ndJ5tdnxt6gjSwpB+xV/wgT2/hCPeUp0SXog42bPtTgeHZzKML1myJJM92Yar2v9jsbNNRK0EqmZ8HewOCo1Ms2bNzI7H2v7BNzN9rDKOJxL2nPFJQ32OZgInZcK6UdljKnFen0SbOzkZNBj4UWKGwuwSy/uIeRGOU3conH3Ff465R4UBTOLRJKuO+/FsH3NXp06dTAqLtLQ0z/vvv29ed3sMfJXQDFloBx9FW6HA2Q6aalJARHvNQ5OEFvLrr782qSfwZcP064ZBgwaZgBUL6WhwfMcPjGADa/bj90iDD7ITFaoSGN8HGgsRC5J1QMbpmUghVPYID878KQgYOFFaFbyb9gO9Fg3sTYxJAyEwGsfy/T43GbZ9G3nF4oQfAb4i5LeyjppARBIO3YkgNMSiD4Ha5LwrVapkSlHceOONZoxYZHGWtU7PLI6h5k6wPDzRJCv5wiJtPxHmhD/BypnbKVnBFGj9a6JNVhz349k+m2SEKQKRCFAI14eNaEUc650mMsyJCIG2LTunEZoJEIj2NZg6dap5/jRs2NDTvHnzsAIP6DdBPPQXoQ9HdMoA4ZuF6Zv1iAhC1qRIgw+yExWqYoTvwhzpzoAHG06TOOXRJqGl2Ji5aUitwM6AxZZdAQ9Lwsbtzqpfv34Bfa5sf2ifiBTnriLauxin3ZzdNg/waC50diFCYOvTp49JPYHAxCKFsyMaPuoTsnvDCRg4XxLi2V2hE9/FzFezFQs4j2+//Taqbdq54wxoQPBkUWJhtRpP5hUaTzRW4cwdxhuHXetYatuKFvY4CBQkw3U6pkbjOM57AEHfGWWViIJVMqO+c4HHxa5bRETa18IZL7uWcd9aDbOtN2rbszDXfRNLRwvWk507d3qtAm7Owa6ttpYmkYLWP4v7nXNASGMNYK2JNPggO1GhKoYwgV9++eUsLdQs9ghPRGjw4GUS8mDkYYkp0AlSvjNzNGAWtDeaxU5GbgBCVXHCZIdBdt9o4xSoKISMI6UzTDur4KyI8GSzY7OwkDMGMxeCg4XX+Zt8Jr7j6++6cBMzltZ5NNaCFbtNziOaKRfs3Bk4cGAm8ydhz85iwIAARXSpUzsVau6gHSW/EJpAMkDHKpqR3SkFVMmLw7yPZvucB8I2O2I0dpgiFCW7sVqmSCNSiVh0ggmQyhZODXWsNISWrAg5W7duNRs5gq+cpmEy2bPG+EaOJjLqqB5DyFiMox118cC38GMo+Cw1/6gVN3z4cJNZlgzZZBCnwCpOidRUAjLQkt0Xp0Wc+GxmXGq/ObNWW4dE3idDcMuWLeXHH380mWnJJEwdtmiCIyI13nBEpJYYNdjoO3XeICvOsIwPY0HttXvvvdcUECabebt27UzWYtq2jtjUicKRnb7wPTs+ZCL353SK0yhFOXG65Ls4eVvHzmhDP3EixZGX+cIYZRXn3CET9tixY03hYsARlnnywQcfeM/J1pVkXELNHeYX9cTIWM58oU4fc+j333/Pcr99j0PGZrLnU7uMa8rYUMw2Gu1znjiCU4eR2olkwacWIfXJFCU7sY7YvpnT3UKlCed6SlCTLQBNBY7OnTub50OiBp2UKlXK1GikKDw1RZ1O6azFCeuU7gctqBxFfAtf8kBnshDxQsQFE8YKVoGiR5zv2f8pLspD3Ub6UZ6FBxrHoggpNxSTjqguokd8H4T+sAIGZRAohMkDnfYpbErxVl+IGguncK6Fh/YVV1xhzoFim8CDnmgaHpgUEvWFhynnEGycgPdYjKjuTgV0opY4L86JRYSK71Stp1TDihUr5M8//zSRJM42bbkd3+vIseknQiwlG+bOnWuisTgfW8090rHxPS+uI+PfpUsXczyKMSP00PdQBUeDjY1z7hARxPVmTCjpQCFYXqMKPeOD4M/vNhIoGJSaYB7SFt+l/A5CFVFdRI/5wrkQKRTqevrCNeUeeuCBB0xBXgRg5ibCPwJWpPPGQikPzoPitURPURqK86A4LkKjL4wfD6tw14Jwz9stzmPY30MV/c6p5LRxYSPCporC1ay/lD1i85PING3a1PzPs5Ki5whTbNRYb9wUkU4UVFMVJXjIcdPyEFi1apX3NR44VO2mjhSChD+N1c8//+xdxH2r1AMPEypzUxmdkFg0DGjB0DgQtrxw4UIjNHzxxRdGwHCj/SHkmQcVDwpgd8DNR50oJrHVVtAWtfbQCNmdTyicx+d3akGh9bFjQs00tElO7Yhl2rRpRmuDkBjqQWTHhwc2AhAahqFDh5oFBEGCtBNUK2enxoMSLQeCS6jxsbXh+EETU7duXSPEcm19NVYLFiwIa2xsVXrOD0HNCgOA5hHNCXXTHnroISPkImTZEHQWGGqv2fpebsbGOXdoB8GJ+ckYM+c4N+Ytc+fCCy90NXcYb9q1WkDquF177bWmv7zmHB/GncWdhTLU9fQ9NnMUQQfhx54L9R/RKnEM57xhMxBq3vi2z5xnsUZ4A+o0UruM9hEEnfcA54G21U2ou10L7HWNhUDlPAYh6XaMrGAVDWKZfsR3jfB9LavYa2fnYk4RqOx5spn//vvvjTWCe54Nmk1/4G+cEinVzKxZs4zWivqHTz/9tFnTeVYlDfG2P6YCvlXBiUCzWCdqHKXxXyJjrMX68pDlmfT7gUoF4IhIOQeOw2fxScJXBqd0p29IuDZ5+mQzAtsUDdiv/WXcfuaZZ0x5hlC+RU4nZpK/4VxocX4X+7k/h/VQTtL+wN5u/afwG6DuFf5J1JPDJ4hEhNbJOZzxIaIF8Ks666yzjBOl9TlynguJGcMZG+tfhi+PE7JZcxybQI+w4QIFCniGDh0a0rk+EP7mDpFGTt8hZwJQt2ODw7/TsRsfuVq1avnNYo9PFwkUgwVA2Pf435k1n2voPA5RP/j/+fs+YdihnOuZD/iX2XlJ2g1naDZziUgkf+fBvRuq5qbzGuOjRtRStHHe8126dDHHIVIqGkk7fcGPM9r+LM4ABBIa20z60XI+dl4DouJI5RBNfH0wsyOQJVxY75gbwUoMOceJ0krOZ0G8WbVqlQnAsvd+ojql+0OFqizi+6DkoUhknq395VzM/QlWzhuSKDzfG5TJxKKDsIaww99E+SH84LweTqSFm3Mh0sIuQuTGwanZwoMIYcnNYs8YEFGGk7GzDpX9DMITaQ5sNJ4v/pykAzF79mwzJowd7RPdVqZMmYidp/2NpVOwsmPgdOoONTa+84Ts0py/sx4WQhzRkbYPZBimgLSvoBDIud7feQSaOwg6zqg9twSaZzia4ujNYgik/XAGBbA4hrqeOOsyJt26dTNRP9Sms9j7gvNBqLLzHkGCGmNuneupwUhOH66jMwWJvT4IdIR0UxsPEGAR8p1CaqDyR87s1gjEl1xyyXGfidbDgbnHeF999dVG0CRTNqVOeN0eIxoRjMxPNig2C39WcV4LhEGCbfgfx+po4LwG5JRyrl++fcgKjLOt15eoue7s5jiUQEXaGVtWxn4+XhxLIuEpECpURSlCiUXUVgUnBxB1kXwXNh4MCFYshs4HjpuJdMcdd5gyA0Tq9e/f30S9kZ8qmgnQWCh4AFNZnPB+NBoUFQ0HHmj0iyR/aKqIZuNv5y6IceDBhLaEXElO4STSm4qdFkVcGR8eMES7oLEiL0u0oM9Ep7AIBcvhFAjmCQIfOVgAwcZX8GNx4yGJcMV58FBjbhEGbccm3AU8O+YO54YQiIBLUWQ0qaG0Or5QkoISQ/SPPDdofO1YAeePIEiiQK4rx+GB70Zzx5wj1QbzhPbRChJR6CyLYR8yCJ5EHXEP0D5aSLewWeAecgpUPNzQlkbzAczGB4HECvJoxNjAME+cc94Ko5EKWrRXuHBhI4SiPY3WfURfEQLZfJKfCK0KEWzREAi5Bsx15zVAWLY1GbPaPjDuzA3n/Ek0wSrUWsqYsLY4BSpfNLVI+KhQlUUQIlAx9+zZ0/sauy52u878QM5F7quvvjILOrtqt1XfeTByE7M7shPdmewtq9jjkJYBwSFPnjxGU+V8zw089Aixt3WfeKBYzZ3vokx9qiJFipjM3lkF8wfjc/fdd3vHJ1DWZuf5hLsQ8kDgAWA1kW7hujNHyB/jTKOA1siZI4y0AfY8bD9tUdtwiXTuhLuQ2p0wGiYeMnnz5o1o7nANETSdiz7mSsbbgjDL32xKwjkO5pC2bdua4q72HBFead/mvbHnzXVig8Q9EG52a4T5smXLejVp5P7iuFzXBx544DhhxxaKDYXv8WmffHW2EC5CaMmSJc1aRKoLpxYFgYs+RAqh+Wj4EKy++eaboJ91cz8x3qT0sOfO/Ed7iAYWbb3FXo9gRdT9gcmLa2AFToR1NhGsa88///xx1yDc9rkWrC2YiUuXLm02AsHOP9z2swtM8mx+LGiHbX4rnlGBzkkFreCoUBUBvsnUeDg6Jxy7XdTytuCj76TkwewrcLlZjLgJ3Exufw8At3Z/fHZ4AFtNWyR5U2666SajGWHniRmIhx8LMxlx2V07zSccx3ehdu5W3QqdZDomV5Xz8/7Gx44zu9Zg5jo3xwx3XJy+HVwPBHKS/jmLPmN2YuEPdB6RLmhu544dH5tUNRyN3HnnnZcp11a4cwdBEoHAV+BjzvBAtGAu4jg2q7Kb49AmAgdaEWseZFODUO9rXrUCupt7wN/rnAcbCfKc8T+CGfm10JxabTZQNBetmNOnKNg14Zo586Y9+uijZlwQmHg4on3DzIrgiDbP5vRCoEQbESzLtb/5YNcMNEqMNT6fbAKYxwhEZEe3QhtawED4jhH3HT6klBsB5kv+/PlNySQ0J/4qQ/jz8wzUvu0z15v/cWlgLCh7gjn9tttu836OsYqk/TVr1piSWKzxCFeBBCtM+qHazy5hxd95MEZYVtAI43uJqwbWA66zMyccG2LnOYZq/1gKmPEiRYWqCEFgwJ/D90FpQePDQ8YXp+8GCxUVyq1aOpBgFa4jJBOa3SC7VbRAdqfkRnDD9GcXy0gT0WGWYYfOYoJAZXfTgOnTN0GpPZYTHnyYB+lPpEKML04/AsxwVHPPDnz77fz74YcfNmMSzjVmvvAAdUM47drxseZsNDXhOK9ifqWCfKRzB4doNDoERTh391ZjhRABCEbWATyc46Ddon3mJxpVNHjlypUzQhQPNCtsMbY8zEO17/SXpD2r8QIe5mgxpk+f7n0NLQzz7p133vG+RukkN2ZS5izrCT/cF/b6c0wS3aIddkKSXQR2JwRxBJsPCNBo/ny1ZwidaMWAum4Ihwijb775plc45KHs9A/0N0Zod2yZFwR2NJv4XSIQohnBRIq5sXjx4mZTZrn55pu9Am6g9hHU8OdzXgPMx/hWUlHBgoYZwcrZVzft+8u6b9tAKEaLF0iwCta+v3ubZ4KtXxotnIEg/Fghj40Fml/MpfbacGySVrN+W8UAVoVgwVT2Hjlw4IA3I3pORYWqMLATh4zdRG7hdM4D0anWt59hd4jK3N/NxALJTgATIP4XtGVvomhI+NwI+CxQpJOdCDeH05/ALVnpCw9CBCLMoM5s3ggR7KxDaYnYkdetW9dE9bEQ2l1cpH1yOsjiKO7PgTU71drO8+AByCLm9twQBtGE+i7eWem/U+BEoEJjyQ7WBlWEO+6RXiecztF68HC3fkgIAmwO7DVzzgU3x3F+Bo0NUacINzzsGEvmgxtTcSjnd+ar7SNCH1okZ/Qrc5r70blehHJ+t8dCw8W4cC8g5KDVQSgE/NgQFq0vFUIRQhYbO8bKrYkb4QgNHZpS54MRJ3XODWgL0xqCidNEBAg0/rQVjBH9475nLbKmScYcwQxtnq+mG4HLuUZwjr5j5GwfbSbt8L8NXEDoQUPu3BiwzqLppNyXk1DtO7PuEyDk+xl/gpVzzfXXvj9YM/FlxY/PRnRnFdtHtLXMT9ZUxsVqrx977DEjWDndDBAeOV9bZzZYMJWFuXHjjTd6v8Pcy+q6nYyoUBUm3OioSUlnwO6FHSOLqrNyOZPORoewO2ayOc0ohH5ju+Z1qm4T8YRKOisTz9k+D2lb94kbiTp4zrIwsRQenOfAwszOGo0eCwqCFv4qLHxOx13f/tv+MXb4iTCO1MWyr4d7o9q22S3jy+EsX0PxZUxukZoCswrngsDAAzDQIuprgsOchFBuzWTMIcbaubsNZy7Z9jk+O3vrHM6uNJgTazRxzkn8qrg/GBdbfgPtDqYydtiRzF+nYMG9iiO6hQeK09TnlkDO77fccot5319kLvPfamHcCjucL1oCpz8QbfOgRyMGbKBwzEYIRlhEQxxOKSj6SH9Y25hbBKg4XRTQ5qHhswEU+I2iseL6WDO9v/NhjIiaxdcOLSZzl4AGK6yjXWL9s5pH5iACIw997tdQ19re0/hNYTUgmhjBlb6zxtgi1M5rQNukQXFzDXif9tC8k3IGLSkbVl+B0s4rNtr4b0UK9yKpSYhwRZvn1Bpm5fnA+oYwyTiRpgTBnrmK4MmYOzV8wHrNOm1N7G7vuW4ZkbuB/MlygnClQlWYsIiwI7ILDtI9k48bzqkatruTfPnyeYYMGWK0W3ZyOhdWFp0XX3wx04PeCQ7foRyVUZnb9lkEUNVjinFOdBZkbiC7I7eLCbvkSB2h3YB/CYsqPyz6+E74qpCd/XeCtgLzABoTdkBO3yOL75j74myb8+ThZCMaEfh4gLAQsohZh/FIxyZSB3gWTsxQvnUJfftvNTOo6fHn4CGOSQzVPX4dPOwQsCKdOwgzTtMsghq71UC+OKHGPlycCzf+NjzICIvn2nMfOVORZLV952vcL860CW4J5PzOazaykjHkAY6AiJaW+W9NpOGAnxHaJ+c5IETzAOa6oxXhgcmDk8/Zh364DzGOQ/9Zj1iXrGDIa2ixnHMUv6JQML+Yq7buHP3noc5GFIGKjQFzjjURAR4B1ddlIBi0wTnbvnBvsD4jNFvXDIQrNMH8sBkuWLCg69xbCPGs7zZnHfcT8+WRRx7xO770g/vRKbSHC+sSmk+uAZsJf/5Y4UZJ8ixCGPQtVszY2za41mwu8BHmmYVfHs81N9g2hg8fbq4jZkU0hpwHgj/mdGdfE9V5PxqoUBUBLPLWns7Nw2JjixL7hmizo+PBx8JiNQk8MFA/2xuDhQdzBFoTpxaGnQ+7QZszJxCkaXC2z43BAoLAhuqbRcqaKtkl2gWIBclN+5E4wDs/yxiwWHMDOyuxB+q/hYWMBYYHBg8O0gGwe0PTZxPDMfb4OoQaG3sTs5ji68LOHg0eiz0PQB5IvG6dhlmcwxmbSB3g7fcw69DXQP33HZuWLVua15lbjAMmIYRnHtzs3t3237bPztRZvd6aKhDGrS+T7SvXDlNTqLF3EzAQ7LPsoJk7+BChgQikyQunfSd2DiLk+Bv7UARzfrebGq4b8xazCyYw/GXCwfaR+wYNCGuHMw8XvlysO2iA+KzTpyUcfzM7hqT4wByEQM79wbxiI8k1YCPoDB5x80CnL8wvhAN7TVgzixUr5h0LHua0z8YL8xmpLJznHgza5CGOEzrnztqHAE5bbJjYRCGUYAlAQ4XA6c/3K1j7aE3R0lmYi9ZlwznPnH5FofB3bva6IrC99NJLRhChvxyb+8yOF/M1VDSnb/vMS54BrKn2umGmw3/NbibZkKH1Q+BlkxasuHugazN58mRjGmYjjMaWNjC3c12tkOsm+CCZUaEqAhBG7MLFJGJXiPqfCcuNzA3uhF0B5h3nBLd2fiY4mgoWRmeYvjWPWefBYPi2z01t1cYs/CyQVqjAtMMkt4uBm91mpA7wvouufVD7Lva+/XcKbJgjEDYBx1t2+viX2LZDaUv8tY3mpWjRosclHMTsgOnUtu12bKLpAO+7WPn23y68LFiYRp3zAz8MTGQ2qafbueMvcMCCdhAfK2fah3A0Vc5oQrQPaNdCBWaEo12JpP1ARGKaCOb87pzvYO+XSJz4aYuNBRoda0638+Ghhx4yeeGiAQ88tMPAfYdAxKbM1wfJLdzDbDS5r/DNYj1ijHiY4xdoN2X2f2vSDsdfDud5xps1lOAK5gHjwzzgfnBWD7DrYjjXAGEGR203WffdCoJO53rfYBCeJ2iVgDHjGiCoo2UDnj2sCYE0yM6M9Ww+sU4wTwj2YHPLa3zm1ltvNRsj5/OKzzJPnWZT33MKFHxg18w6deoYYdBqybmmPHOsqRrw2XTrvJ9sqFCVRXwFBwQOf6YEHtjODNG+sFjaEFbMXjh4swC4fTDQvr8oIt/+cZPyWetHE87iHokDvNswW9/+2ygVjmW1WzgUo4pHq8TD3unHEU7b3OxEXdmcOPa7PJzwrwkn2jA7HOD9XVvGhAXRaTZlgeOa2Igzt8cNNHcsmAkwxdkHUri+bYwN/bJZ9nlIRJI8NV7tZ9X5PavRq3acudcQSBCC0UTbew+tBmZaHoZZ8VnhuwjKOFzzO8cl0S1+VGgsw9UsOB2k0RjxoEXIsSlXuGa+yUkj6T9rAGON5oVNmNO0hPsB18ZXwI3kPCz+su77M90Ha8vXud4KTMAmmLEBxgfrAlpnnPqd2lp/0Zy2fe5V1moEHNZqBHE0jmz6+ZtrijYJ4SwcHzB/wQeMhfOZd9lllxmriBMEX4ReWy4sHOf9ZEMLKmcBhFKKpVLU1BaqpNjsoUOHvMUrbcHK66+/XtavX+8tQuuvLQoZUwTzuuuuk7vvvluKFy8esnCus32Kvfq2T/8oDksBZli9erX5m8Kzbiq38znLY489Zgr6/vTTTzJu3DgpW7as/Prrr973/RXldLbv71i+/WfsgPPm59JLL5XXX39dqlataorp/vjjj6ZYKIV2ac+Oj5u27dhQOJciz1RF57W9e/ea1zk2Y85rbsfGFrWluDXFiceOHWve++uvv0whatqKtKCuv7Gx86ply5Zy+eWXyxNPPGGOBRTt3rx5s5QsWdL8Heq4gcbeYuf02WefLfv37zeFTp3t2v/9jZOdN8yJvn37ykknnWQKOn/++eeSP3/+TPMmkkK6sW4/FJyzHb/Ro0fLmDFj5Msvv5Rhw4bJHXfcYQrAMlftZ53/h4stwF6wYEEZPHiwNGvWTH777Tczf1kn7rvvPlMMvXDhwlkqHMx3KVp9+umny/PPPy+1a9eWq666SoYPH27G1RZfD3eMihYtagqqjxo1yhSD534eOHCguY9/+OEH72ed/7uFa8saQHHsU0891awTjA1QaHrx4sWZCthHMj6+3+GcWKuZgxSgp1hxw4YNXbdl1wu+w1jcfPPNZq7YYt0U7qY4+CuvvGKKtV999dXy3HPPmfGzhbOB71Pg3V/7Xbt2lfr165v52KpVK3n55ZdNvyk8PmjQIHnqqafkxRdfNGs6z4MlS5a47j9FqlmXq1evbgoes5ZStH7AgAHmM4wHn6MQsoXnDgXSuTftteAc8+XLJylHvKW6ZAcVLo7P2KGR/CmA6y/rMLsa7Mq+ETl2F8rOjd0DqnarNQhnVxWofXZx7OBoG40Evgy+YbKJ4ADv2387Lqi40cigWXLmWgmHQGODyQj/BULf0cRgOvAX1RNvB/hA/ef4+IpwTfEXQVMSLMGj2/b9zTvOiV2pG+2Xc2zQGDFvnJowHHCZN/zYWoEWN2MT6/bj6fzu5ljMI7QO+D6hRUTDHQ3/FNs+mmCbgd+SldxD/sYI0xFaYeuvF43gD9rE35V7kRxV3NP4V7nN6RYOWcm678+5Hh9JzK1k5Ac0SFwDZ91UZ2qaYNAuSXRt0AraR7RWNtmqE+YNpsxw1o1AwQdoBNevX2+0ZASVcA9gciQFBebLVDX3+aJCVRYdXnmfCAn8HUjC588R24KwhVqXXCS+8FDgJrJOlJH4XQRqH+EBsx8PTeuf5Kbt7HKAD9V/Xg83N1E4bROdZdM22GOEIrsc4EP1HxMQAgY/ts1ozh3rdMsDy4a9hzs2ZLrH5wUHZEzbzHOivBB+MJPZY7qdN7FuH/yNX7Sd3yMxeYV7XSNZ0zDtYMJ0HstfO+EErvj7HiapYGVvnIk33bbJWkXyWIQeBKtgG4VIAxzCzbofjnM9AU8Ig6ylvO8cT7fmfDa4bJKciWfxgUWIpT1nhn5wPrfc4Cb4YOfOncbHmE0fwQ/2HtSUCjkIp8MrN7ozfD8Sh9dAk4ddE74FTEi7K7HHtblCIhUcfNv3l6bA2cdEcYAP1P9w6+uF03agsHa3Y58dDvCR9D8rBJqb4eI7NgiX+IygtSNxpDOqiEUXvw/rW+FmbGLdvr1OPMyJWOKBY+d5JHURg71no8tsBvd4r2nhZOCn/yQ3RWNGBGSotoO1E6jvtsC1zd4eDF8fP+tzFszZms+wzrDpdNN/247brPuRONfjx+ZMMBou9B+tlFNLS6oPjuUPu3Fyew6hgg+OuBi/VCYX/8TbBJkoYK9u3ry51y6Nzdj6ZrjxsXHLtGnTjP/Hzz//LOXLlze+BV26dJGOHTsan6ysHsu3ffwNzjzzTOMPVaxYsbDawjaPXwV2cifYxZ0+O/gEPPvss8bXqkCBAlk6B2f/K1SoYPycIu1/sLbxrcL/iLFv166dGaesjM2mTZuMnwL+Bvi72DHAf2T69OkyYcIE83e0xiar1zacse/QoYPxjQlnbBgXxsfpV4F/1pAhQ0ybgC/GnXfeKZMnT5Zq1aodN6/i1f7u3bvNnMibN69s3LjRfGfSpElSo0YN45sSytcxHPB9wT/nww8/lDZt2kiyrGkzZsyQm266yfhy4ZfDWOGzk1Vsv+h748aN5eSTT/b6KloCXUfnOQU6P2f7tI2fD+PP/Pjuu+8i7m84MIeYY/inPvroo2bcGEfo37+/zJw50/ib+fpMue2L7/jgr8U9w/FYN/CRW7BggfGHiqR9+n7llVfK9u3b5Z9//pEePXpI5cqVjW/h3LlzTb+j+cxMJtRR3cHtt98urVu3ljlz5phJh0PeQw89ZN6L5uRo27at3HPPPWbB5wGMM+K///5rBKpoHMu3fRyoN2zYENZDN9YO8G77f8kll0TUfzdtX3bZZaZtHprhCFSxdoCP9bWNZOzdClS+gRnWoZzz5qGFsIPQtnLlSvNQQ9DkPfvwCMe5PtrtO9vC+btFixZGuPzjjz/MutC9e3fzmWgJVNZhF8dzHkgI98GEkmXLlpmHWCKsaYwRc50+I6ThsM21CRW44gb6xT3TqVMn4/BvBSqEgKVLlwa9jqECY+zr9I2AIIRYhBfmO87n1sndnqPb/kbbuR64VuFi++I7PhyPtYqAEza+PXv2lJo1a0bUfrjBBzmOeKvKEgVUxzgs4zNkfUjICOuvKLI1OWTFOTTWdeai1X4sHODjPT6xHpusOMCnytwJ5PyOGQJfFxz5MRcXLlw4rGSMsWrf6fyOGQb/FjKKWzCl4OyL2cZ3jCJ1fuce4liUacHB1zr02gztFs4NH0buNXLcJcKaRt8ZI6dPFCH2mI7xJbNmRGsKCne9xExLe9ZnCadnzLj4cOL8bPMoRdo+9yjBHc7+M19wuKYmnm9bWV3vo+lcH2mZJnyqSP2ALyy+h9FI8xFJ8EGqo0KVAxYcWxPKLpYk8iOKwmmvJ5oCh9dwFrh42Zij0X60HeATZXxiOTaROsCn0twJNDb4ouAIjeBpfbeiGXwQSfu+zu9E8pIo0QpLJOMlCSoO8BbaRBhz4/weLAu5jaICsq/7E6zAWZzZLfg7xWpNI+oQ3x2+T8ZvHLcRfCi+zI9N5IlAEq5ACAgW+MghGCJI4QxNbiP+xqHbJkiOtH0ctPEFnTZtmhGW6T8+QeSNIiLOlprh3CJpPxbO9U5fMJzCndn1Q0EADedo6/n58wXLanWCz0IEH+QEVKhywMJos0TbsGUWbWf9IxuJYmt75RSi6QCfakTTAT6VxyZY9GA0AjOy0r6v8ztBB0RyEhrOfCepJw9bnH2J4HS259b53aZasHXtAkXXEUaPYGXrzflGawU7P9/PsKY5qzdEsqb5tm3/5ns2lQoRYSQHttoctEwUm3YjEAZqHxDaSFNjNSsWtIZE1kbSvlPAJGqb8cDJ2qnRRNiyWc1Dte97nHDmciTO9QQLEdVKRQVn0etQMJb2Homm874/juXAtc6iQlWQxQ1QZ9ocONzY1EZiZxFrE0wiwiJPaC7mPtTUlDnArBWoJltOHRvCpRkbHvj2oZOT8Tdvojk20Wrft+oBmhiKgKO1IAs4hWbR5jiLozv/94dvOgAKzJJiw9dk7PvgQphDq+A2KtCf0BaIcNc0N237fpeyPZhnrSYl2EPWX/vOSFkiONFQOdvBjOUU2sJt31e4clYiAMYHbZg1M7pZ7yON5nRTdcIZDYnGlJJdzHWsK8G+5+84/gQqZ6Z0MqQ3b97cmFoxTSvhkaMc1Z3Zwf2BsyWRQzjzWSdF/sd5EOe7a665xjjI4lAeaZbsZCbWTtLJTDQc4HPSvInm2GS1fV/ndwIugMi2999/3zhf44hLdO75559vHL79ZZb3hbb+/PPPTMcgizTO0eeee658/fXXxzkTW+fuJ5980kQtEmXlZk2jD/zgjNy7d2/joO9LuGtaOG3zPuvmtm3bzN+sCwRmBAvOCNa+7UuVKlXk8ccfN+OG87oNCmE8WXdsNYtw2/eNviTSk9epSMCYE6DAd9wGUICt8ED0G5FxBDi4wY1zPe2S0b5OnTqmr2+++aYJnLBZ2N04hTuz1vt+PtrO+zkaTw7B6YjqT0JnZ4UD35gxYzK9zo4RiT3STOepRk7U0LlFxya1nOv9tU0+LMyNbnAmz7W1LHGOxukd53HWFH8BDL6mlkDrjW/FAyB/EJUOcHb2bTucNS3ctnFMZ+1Eu4MGCfMl/jWBCLd9fN3wD8PvCK1hWlqaSfYarfZxUMeBH18wNJaFChUK2n9/2HlCpnV8wAje8ecbF4nzO22TPR/NqQWzLlqrQElmw82HxxgngvN+spNjhCrf7OC+AhX2afwyfBk6dGiWM52nIjoGgdGxST3nehvNhnnEbVJafwlieRDahzwZswMJVrEU2tysaZG0zWeJAEYYsaa0QNcjkvZpl+ADyv9YQSKa7eNvRLkwgkusb2Qos6IvHC9a0Zy+7TvL1FizKoIm8wicxeUJROAcfcs0+fbDF8Y3ns77qUCOEap8Fzg7oYigYEfhT6CCFStWeObMmeP9jj4wFSW1iVZmeUDr4axL6PuwJDKPh18kEVPhCm127eIzoda0aAmEgdbLrLQfzDcomu0H679tB+0O0XQ8R6yTuTMIINJoTmf7CDfjxo3ztu+M+KN6QK1atbwCl7O/VLwIBp+ligdC5JNPPmkEQsYNjVi0nPdzIjlGqPK3wCEwNW3a1Kg33aAClaLkDJzO7+zUbVCGTRMQCvtQ5IFLO7ZMjj/BasiQIUYjEEnh36wKbcHWtFgKhJG0H250XazbR2tJPjTSSNSuXds4eNuUHM5yP5FEc/prv1GjRl5Li/O7REFiErVBEb7tBzofojURkohyPf30001kqy1ZEy3n/ZxIjhCqgi1wtt6eoiiKEx5G5EIiYgyT0VtvvRW1JKW+DyXyFAXzEcpOoS3WAmEyt++M5uzbt6+J9ON4mNsw+xGp6C+Fg9toznDat/8j7ONr5RSA3LRP7T60UsBmAe2s0z/ruuuuM+ZQ0nDwPsIbWjH+VgKTI0LYbFmJBg0amEiGiRMnet8jUkhRFMUXNp1FihQxUVb9+vWTG264Iew2GjVqJH379pU77rjD1F1zRl3Rvo0KHDBggHTr1s11dFWgNc1+n2g1G0lIFOHTTz/tuo5cLNtO5vad0Zx8nwhTahNyPEqNcf3mz5+fqVRMONGc4bZv/z/rrLPMZ6kh6Lb/zDvGg5JaQNkZfigFRNQf/TznnHNMzdLTTjtNLrroIlOb8rnnnpOyZcuGHKscjSeHEcgRNdzkZoqi5AyiYfaPpp9WOGua20jCeLSdbO37BjuRTBNfJPs9Ig4rVqxoqks4tVRujxNJ+/Z/koD6nmOo9ikBhAYWUyX+ZphCiQpt3LixyceGnxb5wQYNGuTaeV/xeMIrgZ0CUMUeKf2RRx4xRYDJ+4EkHs2q84qipA7RKAzbo0cPs8On2DMFgitUqGCKbFMAun379lnK9RbOmhbuucSy7WRrn8LUaIxs4fszzjhD8uXL583xVLhwYVNQmELeNq8V+cDQdro5TiTtk1ON9suUKWM+H6xgu2/7zElyeaGl4/t///23VK9e3RyHfG9XXHGFyVdFjrCsFoLPSeRCspIcyLRp08wCR5K3aC5wiqIogWC53bt3r1l7VqxYIQUKFIjIrJjda1qs18tkab9r167Sq1cvueqqq/y+j5msS5cu3sSxTz31lPz++++uj5Ed7dM2x3CC0OZMcPrjjz/KM888I1999ZXkz5/fVdtKOjlOU+XMwnzSSSfJLbfc4l3gNDu4oijZ5aeVTGtarNfLRG8fbRfaLbLP810yu/sTNri+ZCH//vvvTXby1157zdUx4t0+AhVaLzLik8UerR4Z8tFkWW2Z4hJPDkZDQhVFiQex8kuJ5ZqWDFnx4511n2g5kmJGWoEjXu3j90XiVtomFQW5G/lbCZ8cLVRZ1PFOUZRUIpZrWqJnxY91+4Gc3wFBJ6sVOOLVPg7sP/zwgxG4cIa37SvhkWN9qhRFURQlEvA1wucIE5x1fgdMaGvXrjWpeuyjNRLTWXa2j/M6RZr9oQ7q4aNClaIoiqJkwfm9fPnyJjIPJ/KOHTuaCLusCiTZ3X6JEiU0WCsKqFClKIqiKAkWzZkK7edEVKhSFEVRlAjwTUWg7SsqVCmKoihKFoi171Gyt5+TUKFKURRFURQlCqjeT1EURVEUJQqoUKUoiqIoihIFVKhSFEVRFEWJAipUKYqiKIqiRAEVqhRFURRFUaKAClWKoqQUjz32mMkWbVm1apW88sorcujQoagf64orrpDJkyeb32n/8OHD3vIhiqLkPFSoUhQl4ZgyZYrkyZNHatSoIVWrVpUyZcqY15966ikpWrSoeZ1SGvfdd1+m7+3Zs0cGDx5sMkNb3n77benfv7/s2LHD77Fq1qwpRYoUMWU6gv3wmZdffjnTdxs0aCC9evUybfft21eKFy9+3PfI/zNv3ryYjJOiKImFClWKoiQc+fPnlwoVKsjKlSvlzz//9ApJBw4ckKuvvtq8zv9O4QlGjx4tbdu2lWbNmpm/N23aJK+//rr069dP+vTpYzJI+1KwYEH5+uuvjWAU7AeB7dZbb8303QEDBkibNm1k+/btRnij4O3OnTszfa9w4cLH9VNRlNREhSpFURIOSmdgRkOQQVBBawVofOrWrev9HAKMBdPbCy+8IBdeeKH5GwEKQeree++V5557zgg311xzzXFmQGeZDmqgbd68OdP7w4cPN/XQ6Idl+fLlRlA6evSofPTRR0bbFQzbf0VRUhsVqhRFSTgQiNAyoXU6++yzzWsjRoyQX3/91ZjboHnz5jJs2DBjlluyZIn5fenSpZI3b145cuSIEYQQtO666y7v97ds2SKnnHJKJp8rJ88//7w0bdpUJk6caP7evXu3PPLII1K5cmUpVKiQ93Mc8+DBg0bLtWDBAmOO9P2xbSiKknNQoUpRlIQUqsqXL280U5MmTTKvderUSd59912jwUI4Ou+882TdunWydetWo30aOHCgtG/f3nz2nHPOMVosfK4wzQHfueOOO6RDhw7mfwQvX8aNG2e+0717dyOk3XzzzUYL9fDDD2f6XFpamvnfWS8Nk6T9wXSpDuuKkvNQnbSiKAmHP98nBKjzzz/fCDmY8hCk5s6da3yuNm7caBzF8bmCZ5991jiRn3rqqfLEE0/IGWecIX/99ZdxdP/999+N2c4KRk4Qkm677TajreJYCGaLFi3KZCL0JdB7wb6jKEpqokKVoigJB/5L//77r4n6Q+NDxB9mu+uuu844od94443yySefGA1Sq1atzHfQLqGBgsaNG5v/EbwqVapkfscsyA/4E6h8hTo0WWjLcE7/7LPPjCAXiLVr1xqTn4W+K4qS89CtlKIoCQcmPYQoTHbz58/3vo4w9dJLL8n+/ftNeoO77747aDu7du2ScuXKhZ3O4ZJLLpH3339f/vjjD5PnqmvXrl4tmD+qVKmSyfyHv5eiKDkPFaoURUk4cDyvU6fOca+jpTr55JONwIUTee/evQO2gRC0bds2KVWqlKtj4nj++OOPS48ePeStt96Sc8891+TIwuEc0yPmRX8E8p3yZ8JUFCW1UfOfoigJx08//WS0RYD/k69WiDQHCD8ITWXLlvXbxsiRI43w5XQmDwa5qvjOhAkTvCZFqFixonzxxRcBfaSsUOU0/4Hb4yqKkjqoUKUoSkIxe/Zs+e2330yk37fffiujRo0ymcnnzJljStAQEcjvOKDjtI5D+dNPP23SHqCdQsiZOnWqyU/13XffZdIc+dMqWY1Sz5495YILLvArPOG47sTmrMLvCod4TH6BzI9owJzpGBRFSV1UqFIUJaEoXbq0DB061AhJRN5Rjua1114zqQ7QUk2fPt28NnbsWCM0ffjhh15ndBzT+XnxxReN0IWp0IJww48v+GdddtllIbOeI5CdcMIJRotGUlJAiCNnlT+++eYbufjii40/Vrh+XYqiJCe5PJpMRVGUJACNkts0BSxr0Ta/2YjAfPnyufo8AtzevXtd+3QpipL8qFClKIqiKIoSBTT6T1EURVEUJQqoUKUoiqIoihIFVKhSFEVRFEWJAipUKYqiKIqiRAEVqhRFURRFUaKAClWKoiiKoihRQIUqRVEURVGUKKBClaIoiqIoShRQoUpRFEVRFEWyzv8DrfSbUvQuYfIAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 分箱分析\n",
    "f_l_df['close_bin'] = pd.qcut(f_l_df['ma15w'], q=20)\n",
    "bin_ret = f_l_df.groupby('close_bin')['ret3'].mean()\n",
    "# 可视化\n",
    "import matplotlib.pyplot as plt\n",
    "plt.plot(bin_ret.index.astype(str), bin_ret.values)\n",
    "plt.xticks(rotation=45)\n",
    "plt.title('Close-bin vs ave-ret3')\n",
    "plt.xlabel(\"股价区间\")\n",
    "plt.ylabel(\"3日涨幅 (%)\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fd79ae1b-8ec9-4a89-85b6-8db2d7c31ae0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
